【问题标题】:Java stream create object and compareJava流创建对象并比较
【发布时间】:2018-04-26 20:39:58
【问题描述】:

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

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

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    你可以像这样使用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);
    

    更新:

    如果您想通过给定属性从所有小于预定义TestObjTestObj 对象中检索最大对象,则可以按照以下步骤进行:

    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&lt;T&gt;;如果您不熟悉它,请查阅文档here 以熟悉解开Optional&lt;T&gt; 对象的不同方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多