我根据以下条件比较两个lists:

  1. 如果list1的值更大,则+1将返回结果中的第一个元素.

  2. 如果list2的值更大,则+1将显示为结果中的第二个元素.

  3. 如果值相同,请跳过它.

我已经用Java 7实现了这个解决方案

int min = a.size() > b.size() ? b.size() : a.size();
List<Integer> result = Arrays.asList(0, 0);
for(int i =0;  i < min; i++) {
    if(a.get(i) > b.get(i)) 
        result.set(0, result.get(0) + 1);
    else if(a.get(i) < b.get(i))
        result.set(1, result.get(1) + 1);
}

return result;

如何对Java 8流执行同样的操作?

我提出了两条流,并合并了这两条流的结果.因为我不知道如何在单个流中同时满足这两个条件.

推荐答案

使用IntStream中的range()方法,我们可以创建对这些列表有效的索引流.

要筛选出值不相等的索引,我们可以应用filter()运算.

将结果累积到由两个元素组成的列表中需要更多的努力.为此,我们可以使用collect(supplier,accumulator,combiner):

  • supplier-返回新mutable container的函数.在这里,我们需要提供一个list,它应该保存减少的结果;
  • accumulator-是一个函数,定义了如何将流元素添加到container中的逻辑;
  • combiner-定义如何将两个容器与并行执行流时获得的部分结果合并的函数.
List<Integer> a = List.of(1, 2, 5);
List<Integer> b = List.of(1, 2, 8);
    
List<Integer> result = IntStream.range(0, Math.min(a.size(), b.size()))
    .filter(i -> a.get(i) != b.get(i)) // filter out non-equal elements
    .collect(
        () -> Arrays.asList(0, 0), // supplier - provides a container which contain the results of reduction
        (list, i) -> {             // combiner - difines the logic on the container should be updated
            if (a.get(i) > b.get(i)) list.set(0, list.get(0) + 1);
            else list.set(1, list.get(1) + 1);
        },
        (left, right) -> {         // accumulator - provides the logic for merging the two containers while executing in parallel
            left.set(0, left.get(0) + right.get(0));
            left.set(1, left.get(1) + right.get(1));
        }
    );

System.out.println(result);

Output:

[0, 1]

如果您怀疑这是解决流问题的正确方法,请查看API文档第Mutable reduction段.

即使在熟悉了上面的参考之后,你可能会认为没有collect()也可以做到.例如,我们为什么不简单地应用filter().forEach()来简化代码?然后看一看API文档的另一部分,它专门用于Side-effects.

Java相关问答推荐

Select 按位运算序列

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

是否保证在事务性块的末尾标记违反约束?

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

Bean定义不是从Spring ApplationConext.xml文件加载的

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

如何从日期中截取时间并将其传递给组件?

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

如何使用Criteria Builder处理一对多关系中的空值?

如何生成指定范围内的11位序列号?

具有多个模式的DateTimeForMatter的LocalDate.parse失败

对角线填充二维数组

Java 17与Java 8双重表示法

我们可以在方法中声明接口吗?

ControlsFX RangeSlider在方向垂直时滞后

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换

如何在 Java 中使用纪元时间和时区查找一天的结束时间

根据我自己的意图打开另一个应用程序