Java流创建对象并比较

标签 java lambda java-8 java-stream

我对 Java 流还很陌生。我必须拆分流中过滤器返回的字符串,使用拆分中的字符串创建一个新对象,并将每个对象与预定义对象进行比较。流看起来像这样(我知道这是不正确的,只是我想要做的事情的代表):

xmlstream.stream()
         .filter(xml->xml.getName()) //returns a string
         .map(returnedString -> split("__"))
         .map(eachStringInList -> new TestObj(returnedStr[0], returnedStr[1]))
         .map(eachTestObj -> eachTestObj.compareTo(givenObj))
         .max(Comparing.compare(returnedObj :: aProperty))

我该如何实现这一目标?基本上映射列表中的每个字符串以创建一个对象,将其与修复对象进行比较,并根据其中一个属性返回最大值。 谢谢。

最佳答案

您可以使用reduce像这样:

TestObj predefined = ...

TestObj max = 
       xmlstream.stream()
                .map(xml -> xml.getName()) //returns a string
                .map(s -> s.split("__"))
                .map(a -> new TestObj(a[0], a[1]))
                .reduce(predifined, (e, a) -> 
                      e.aProperty().compareTo(a.aProperty()) >= 0 ? e : a);

上述内容的更有效版本是:

TestObj predefined = ...
TestObj max =
        xmlstream.stream()
                 .map(xml -> xml.getName()) //returns a string
                 .map(s -> s.split("__"))
                 .map(a -> new TestObj(a[0], a[1]))
                 .filter(e -> e.aProperty().compareTo(predefined.aProperty()) > 0)
                 .findFirst()
                 .orElse(predefined);

更新:

如果您想通过给定属性从所有 TestObj 中检索最大对象小于预定义的对象 TestObj ,那么您可以按照以下步骤操作:

TestObj predefined = ...
Optional<TestObj> max =
             xmlstream.stream()
                      .map(xml -> xml.getName()) 
                      .map(s -> s.split("_"))
                      .map(a -> new TestObj(a[0], a[1]))
                      .filter(e -> e.aProperty().compareTo(predefined.aProperty()) < 0)
                      .max(Comparator.comparing(TestObj::aProperty));

max返回 Optional<T> ;如果您不熟悉它,请参阅文档 here熟悉打开 Optional<T> 的不同方法对象。

关于Java流创建对象并比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051494/

相关文章:

c# - EF排序问题

java - 使用流在符号更改时拆分列表或数组

java-8 - CompletableFuture 异常打破工作链

Java:我需要更改 WSDL 的 SOAP 地址吗?

c# - 在表达式树中使用可空类型

java - 从 lambda 内部设置局部变量值

Java 8 在对象的属性上流 nonNull

java - 尝试连接到 JDBC 时 Java TCP 套接字和 C TCP 套接字之间的区别

java - WordPress 和 GWT

java - 我可以在不使用 ehcache 的情况下使 spring 缓存过期吗