Java 8 : Stream a list and map to another list based on different filters

标签 java lambda collections java-8 java-stream

我有以下内容 代码:

public boolean foo(List<JSONObject> source, String bar, String baz) {
    List<String> myList = newArrayList();

    source.forEach(json -> {
        if (!(json.get(bar) instanceof JSONObject)) {
            myList.add(json.get(bar).toString());
        } else {
            myList.add(json.getJSONObject(attribute).get("key").toString());
        }
    });

    /**
     * do something with myList and baz
     */
}

我只是想知道是否有办法使用过滤器内联执行 if-else 条件。

大致如下:

List<String> myList = source.stream()
                .filter(json -> !(json.get(bar) instanceof JSONObject))
                .map(item -> item.get(attribute).toString())
                .collect(Collectors.toList());

如果我采用上述方法,我将错过所谓的“else”条件。如何使用更java-8的方式实现我想要的?

提前致谢!

最佳答案

我看到的唯一方法是将条件放入 map 调用中。如果您使用过滤器,您会丢失“else”部分。

List<String> myList = source.stream()
            .map(item -> {
                  if (!(item.get(bar) instanceof JSONObject)) {
                      return item.get(bar).toString();
                  } else {
                      return item.getJSONObject(attribute).get("key").toString();
                  }
            })
            .collect(Collectors.toList());

或者,正如 Holger 在评论中建议的那样,使用三元条件运算符:

List<String> myList = source.stream()
            .map(i -> (i.get(bar) instanceof JSONObject ? i.getJSONObject(attribute).get("key") : i.get(bar)).toString())
            .collect(Collectors.toList());

关于Java 8 : Stream a list and map to another list based on different filters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47790893/

相关文章:

java - ArrayList 的通用类型和接口(interface)继承的问题

java - 正确地在图像上绘图

java - java中带有extend的泛型方法

java - hibernate 是否保留 LinkedHashSet 的顺序,如果是,如何保留?

c++ - 在 C++ 中捕获 lambda 的全局引用是否会抑制别名优化?

python - functools.partial 和类似的 lambda 之间的区别?

java - 从 bean 类的 ArrayList<UserBean> 创建一个新的 ArrayList<String>

java - 如何使用 JAXB 设置默认命名空间

Pandas Lambda 函数格式月和日

collections - 何时在 Gradle 中使用 DomainObjectCollection 和 NamedDomainObjectCollection?