为了账号安全,请及时绑定邮箱和手机立即绑定

多个循环代码迁移到 java 8:这是最好的方法吗?

多个循环代码迁移到 java 8:这是最好的方法吗?

慕后森 2024-01-05 10:32:14
我有以下旧式 java 多重循环,我想将其转换为 Java 8 流:    List<Integer> list1 = Arrays.asList(1,2,3);    List<Integer> list2 = Arrays.asList(3,5,6);    List<Integer> list3 = Arrays.asList(3,4,9);    boolean match = true;    int list1Size = list1.size();    int list2Size = list2.size();    for (int i = 0; i < list1Size; i++ ) {        for (int j = 0; j < list2Size && i < list1Size; j++) {            if (list2.get(j).equals(list1.get(i))) {                if (list3.get(j).equals(list1.get(i))) {                    System.out.println(list1.get(i));                }            }        }    }(输出为:3)我能找到的最好方法是:    IntStream.range(0, list1Size).forEach(            ix1 -> {                    IntStream.range(0, list2.size()).forEach(                            ix2 -> {                                if (ix2 < list2.size() && ix1 < list1.size())                                    if (list2.get(ix2).equals(list1.get(ix1))) {                                        if (list3.get(ix2).equals(list1.get(ix1))) {                                            System.out.println(list1.get(ix1));                                        }                                    }                            }                    );            }    );这对我来说似乎不太有吸引力......请注意,我正在使用 2 个循环处理 3 个列表。有没有更好的办法?
查看完整描述

3 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

如果位置不重要,而您使用Set它,那么这将变得非常微不足道:

set1.retainAll(set2);
set1.retainAll(set3);

使用流你可以这样做:

set1.stream()
   .filter(set2::contains)
   .filter(set3::contains)
   .collect(Collectors.toList());


查看完整回答
反对 回复 2024-01-05
?
慕斯王

TA贡献1864条经验 获得超2个赞

你可以这样做:

Set<Integer> set1 = new HashSet<>(list1);

IntStream.range(0, Math.min(list2.size(), list3.size()))
        .filter(i -> Objects.equals(list2.get(i), list3.get(i))) // check where index have the same value
        .mapToObj(list2::get) // get the value (as the values are equal could be also list3)
        .filter(set1::contains) // check if list1 contains the value
        .forEach(System.out::println);

输出

3

转换list1为集合 ( set1) 通过提高包含查询 ( ) 的性能,可以显着提高速度O(n) -> O(1)


查看完整回答
反对 回复 2024-01-05
?
温温酱

TA贡献1752条经验 获得超4个赞

由于第一个元素的索引List并不重要,因此您可以Stream遍历元素list1并搜索同时list1出现在同一索引处的元素:list2list3


Optional<Integer> result = 

    list1.stream()

         .filter(IntStream.range(0,list2.size())

                          .filter(i -> list2.get(i).equals(list3.get(i)))

                          .mapToObj(list2::get)

                          .collect(Collectors.toSet())::contains)

        .findFirst();

或者,如果您只想打印第一个匹配项:


list1.stream()

     .filter(IntStream.range(0,list2.size())

                      .filter(i -> list2.get(i).equals(list3.get(i)))

                      .mapToObj(list2::get)

                      .collect(Collectors.toSet())::contains)

     .limit(1)

     .forEach(System.out::println);

管道IntStream生成同时出现在同一索引中Set的所有元素。搜索that的元素属于 that 。list2list3filterlist1Set


查看完整回答
反对 回复 2024-01-05
  • 3 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信