【问题标题】:Java Streams -- How to filter based on function output correctlyJava Streams——如何根据函数输出正确过滤
【发布时间】:2016-12-12 03:55:35
【问题描述】:

编辑:

基本上我想根据 entry.getObject() 是否是一个包含值“value”的字符串来过滤所有条目。


所以我有一个看起来像这样的代码块:

list.stream()
    .filter((entry) -> entry.getObject() != null)
    .filter((entry) -> entry.getObject() instanceof String)
    .filter((entry) -> ((String)entry.getObject()).toLowerCase().contains(value))
    .collect(Collectors.toList());

主要问题是我不知道如何构造它以保持 entry.getObject() 的值,我不知道如何在不丢失的情况下操作 entry.getObject() 的输出看到产生价值的条目。早期的尝试看起来更像这样:

list.stream()
    .map((entry) -> entry.getObject())
    .filter((object) -> entry instanceof String)
    .map((object) -> (String)entry)
    .filter((str) -> str.toLowerCase().contains(value))
    /* ... */

但后来我想不出任何方法将它与我开始使用的列表中的条目相关联。

【问题讨论】:

  • entry对应的class是什么?
  • 如果我正确理解您的需求,您想在相应条目中反映您对字符串的更改吗?
  • 不,基本上我想根据从“entry”中获得的字符串的属性进行过滤,但是要确定该属性,我还需要在各个阶段映射和过滤字符串。

标签: java functional-programming java-stream


【解决方案1】:

可能的解决方案如下所示:

list.stream()
    .filter((entry) -> Arrays.stream(new Entry[] {entry})

        // Map from entry to entry.getObject()
        .map((entry) -> entry.getObject())

        // Remove any objects that aren't strings

        .filter((object) -> entry instanceof String)

        // Map the object to a string
        .map((object) -> (String)entry)

        // Remove any strings that don't contain the value
        .filter((str) -> str.toLowerCase().contains(value))

        // If there is a product remaining, then entry is what I want
        .count() > 0)

    .collect(Collectors.toList());

这样,我们可以拆分并分析 entry.getObject() 而无需多次调用以在每一步取回值。

【讨论】:

  • 使用 Arrays.stream() 流式传输数组而不构造中间列表
  • @Pausbrak 会的!编辑于。
  • 如果你想要一个单一的元素流,你甚至不需要一个数组。您可以使用Stream.of(entry)。另一方面,这里甚至不需要 Stream。您可以使用Optional.of(entry),将mapfilter 操作链接起来,就像使用流一样,而不是.count() > 0 使用.isPresent()
【解决方案2】:

你可以做类似的事情

list.stream()
    .map( (e) -> new Entry(e, e.getObject()) )
    .filter( (p) -> p.getValue() instanceof String )
    //...
    .map( (p) -> p.getKey() )
    .collect(Collectors.toList());

使用 Map.Entry 或 swing.Pair(或滚动您自己的元组状结构)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 2020-07-12
    • 2011-03-04
    • 1970-01-01
    • 2015-11-13
    • 2021-02-12
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多