编程语言
首页 > 编程语言> > Java 8流:简化流中的o1-> Objects.equals(o1.getSome().getSomeOther(),o2.getSome().getSomeOther())

Java 8流:简化流中的o1-> Objects.equals(o1.getSome().getSomeOther(),o2.getSome().getSomeOther())

作者:互联网

给出以下代码:

stream.filter(o1 -> Objects.equals(o1.getSome().getSomeOther(),
                                   o2.getSome().getSomeOther())

如何将其简化?

是否有一些equals-utility可以让您首先提取密钥,就像有Comparator.comparing接受密钥提取器功能一样?

请注意,代码本身(getSome().getSomeOther())实际上是从模式生成的.

解决方法:

编辑:(与同事讨论后再访问:Is there a convenience method to create a Predicate that tests if a field equals a given value?)

现在,我们来到了以下可重用的功能接口:

@FunctionalInterface
public interface Property<T, P> {

  P extract(T object);

  default Predicate<T> like(T example) {
     Predicate<P> equality = Predicate.isEqual(extract(example));
     return (value) -> equality.test(extract(value));
  }
}

以及以下静态便利方法:

static <T, P> Property<T, P> property(Property<T, P> property) {
  return property;
}

过滤现在看起来像:

stream.filter(property(t -> t.getSome().getSomeOther()).like(o2))

与以前的解决方案相比,我喜欢这种解决方案的地方:它清楚地将属性的提取与谓词本身的创建分开,并且更清楚地说明了正在发生的事情.

先前的解决方案:

<T, U> Predicate<T> isEqual(T other, Function<T, U> keyExtractFunction) {
  U otherKey = keyExtractFunction.apply(other);
  return t -> Objects.equals(keyExtractFunction.apply(t), otherKey);
}

这导致以下用法:

stream.filter(isEqual(o2, t -> t.getSome().getSomeOther())

但是如果有人有更好的解决方案,我会感到非常高兴.

标签:java-8,java-stream,java
来源: https://codeday.me/bug/20191111/2019835.html