我对 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/