使用新的Java 8 API流和lambdas表达式检查两个集合

时间:2015-03-13 10:45:32

标签: java lambda java-8

我有两个集合,它们都由相同类型的对象组成,这种类型的对象有一个字段,在这种情况下,' codeType'。

我需要在第二个集合中检查所有' codeTypes'与第一个集合中的相同,没有添加其他内容。我可以这样做只是迭代两个集合来获取id然后检查它们。 但是当我们使用Java 8时,我想使用stream和lambdas(因为我正在学习它)

到目前为止,我所做的一切:

Boolean collectionEquals = CollectionUtils.isNotEmpty(oldOrderPositions)
    ? oldOrderPositions.stream()
                       .mapToLong(oldPosition -> 
                                     oldPosition.getCodeType().getId())
                       .allMatch(newOrderPositions.stream()
                                                  .mapToLong(newPosition -> 
                                                                 newPosition.getCodeType().getId()))
   : false;

基本上我得到两个集合,我遍历它们以获取Id并且我检查所有id匹配。但是我得到一个编译错误说" LongStream中的allMatch(java.util.fuction.Predicate)不能应用于(java.util.stream.LongStream)"

你能帮帮我吗?我不知道我做错了什么或我在做什么。

感谢您的时间

2 个答案:

答案 0 :(得分:3)

其他解决方案要么不检查双倍,要么检查。

使用此解决方案,您可以检查是否存在所有ID,如果存在双重事件且无论其位置如何,则会发生事件:

return Arrays.equals(
    oldOrderPositions.stream()
      .mapToLong(p -> p.getCodeType().getId())
      .sorted()
      .toArray(),
    newOrderPositions.stream()
      .mapToLong(p -> p.getCodeType().getId())
      .sorted()
      .toArray()
  );

当然,您可以重构此方法以使方法进行转换,但由于我不知道oldOrderPositionsnewOrderPositions是否属于同一类型,我没有做过我自己。如果是,请执行此操作:

static long[] normalize(Collection<OrderPosition> orderPositions) {
  return orderPositions.stream()
      .mapToLong(p -> p.getCodeType().getId())
      .sorted()
      .toArray();
}
...
return Arrays.equals(
  normalize(oldOrderPositions),
  normalize(newOrderPositions)
);

哦,是的,你写的是你想用流来做。我不得不说,仅仅因为你有一把锤子,你就不会把它放在墙上。有时你需要一把螺丝刀。所以这是一个解决方案,使用适当的工具来解决相应的问题。 Streams对于问题的一部分(转换)非常有用,但为了进行比较,我建议您使用其他一些好的工具,因此Arrays.equals()

答案 1 :(得分:-1)

Predicate必须使用Stream组件并返回true或false。你可能想做的事情如下:

public void test() {
    Collection<String> oldOrderPositions = new ArrayList<String>();
    Collection<String> newOrderPositions = new ArrayList<String>();
    Boolean collectionEquals = oldOrderPositions
            .stream()
            .allMatch(code -> newOrderPositions.contains(code));
}

在这里我们流式传输旧的并坚持它们都与谓词newOrderPositions.contains匹配 - 即每个旧的也在新的。

请注意,我使用Collection<String>

大大简化了您的机制