Java 8流唯一的整数

seb*_*007 5 java java-8 java-stream

我可以将以下代码减少到一行/两行吗?

DTO dto;
List<DTO> dtos;
List<Integer> list1 = dtos.stream().map(DTO::getFirstId).distinct().collect(Collectors.toList());
List<Integer> list2 = dtos.stream().map(DTO::getSecondId).distinct().collect(Collectors.toList());

List<Integer> reducedId = list1.stream().filter(list2::contains).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

Pat*_*ker 8

在这里使用单个Java 8流不是一个很好的选择.相反,您应该首先创建一个Set,以便您可以执行有效的包含测试.

Set<Integer> secondIds = dtos.stream().map(DTO::getSecondId).collect(Collectors.toSet());
List<Integer> reducedIds = dtos.stream().map(DTO::getFirstId).distinct()
        .filter(secondIds::contains).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


dyl*_*ato 1

我想你可以做类似的事情

List<Integer> reducedId = dtos.stream().map(DTO::getFirstId).distinct().filter(
    (dtos.stream().map(DTO::getSecondId).distinct().collect(Collectors.toList()))::contains
).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

没有在我当地测试过,但对我来说似乎合理:)

  • @Patrick Parker:不,第二个 ID 并不是每次都会重建。当用“Collectors.toSet()”替换内部“Collectors.toList()”时,它将与您的解决方案完全相同,只是可读性较差。当您有“表达式::名称”形式的方法引用时,该表达式将仅计算一次并捕获该函数的结果,另请参阅[此处](http://stackoverflow.com/a/28025717/2711488 ),就像 `for(Type var: expression) …` 一样,`expression` 只会被计算一次,而不是在每次迭代中 (2认同)
  • @user3380739:单独使用“peek”就足以证明方法引用按指定方式工作,对于“expression::name”,表达式仅计算一次。如果您遇到其他结果,则说明编译器已损坏。 (2认同)