【问题标题】:What is the most optimized way to get a set of rows which is present in the middle of the list in java 8?在 java 8 的列表中间获取一组行的最优化方法是什么?
【发布时间】:2018-09-24 09:20:33
【问题描述】:

我有一个项目清单。我想处理一组位于列表中间的项目。 例如:假设具有 id、名字、姓氏和中间名作为属性的员工列表。 我想考虑 lastName "xxx" 和 "yyy" 之间的所有行并进一步处理它们。 如何在 Java8 中对此进行优化?优化是我最关心的问题。 尝试使用 Java8 流和并行流。但是在 Java8 流的 foreach 循环中不允许终止(中断)。我们也不能在 foreach 中使用外部(下面的“start”变量)变量。 下面是我需要优化的代码:

boolean start = false;
for(Employee employee: employees) {
    if(employee.getLastname().equals("yyy")) {
        break;
    } 
    if(start) {
    // My code to process
    }
    if(employee.getLastname().equals("xxx")) {
        start = true;
    }
}

在 Java8 中处理上述问题的最佳方法是什么?

【问题讨论】:

    标签: optimization java-8 java-stream


    【解决方案1】:

    这在 java-9 中是可能的(我已经简化了你的例子):

    Stream.of(1, 2, 3, 4, 5, 6)
                .dropWhile(x -> x != 2)
                .takeWhile(x -> x != 6)
                .skip(1)
                .forEach(System.out::println);
    

    这将获得2 - 6 范围内的值,即打印3,4,5

    或者你的例子:

    employees.stream()
             .dropWhile(e -> e.getLastname().equals("xxx"))
             .takeWhile(e -> e.getLastname().equals("yyy"))
             .skip(1)
             .forEach(....)
    

    dropWhiletakeWhile 有后端端口,请参阅 herehere

    编辑

    或者您可以先获取这些分隔符的索引,然后再获取 subList(但这假设 xxxyyy 在员工列表中是唯一的):

    int[] indexes = IntStream.range(0, employees.size())
                .filter(x -> list.get(x).getLastname().equals("xxx") || list.get(x).getLastname().equals("yyy"))
                .toArray();
    
    employees.subList(indexes[0] + 1, indexes[1])
                .forEach(System.out::println);
    

    【讨论】:

    • 你的意思是说上面代码的优化在Java8中是不可能的?无论我写什么原始代码都是这里唯一的解决方案,因为我根本无法使用 Java9。
    • @User1230321 见编辑,java-8 中有这些的后向端口
    • 只有在 "yyy" 姓氏是唯一的情况下,您的第二个变体才有效。
    • @Holger 同意...或xxx 也是独一无二的。我会把它添加到答案中
    • 因此,要重现 OP 的代码行为,您可以使用 int size = employees.size(), start = IntStream.range(0, size) .filter(x -> employees.get(x).getLastname().equals("xxx")) .findFirst().orElse(size - 1) + 1, end = IntStream.range(start, size) .filter(x -> employees.get(x).getLastname().equals("yyy")) .findFirst().orElse(size);,然后使用 employees.subList(start, end).forEach(System.out::println);
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多