【问题标题】:Replacing if-else within 'for' loops with Java-8 Streams用 Java-8 流替换“for”循环中的 if-else
【发布时间】:2015-07-24 11:43:43
【问题描述】:

我正在尝试将以下简单代码转换为功能样式

for(String str: list){
    if(someCondition(str)){
       list2.add(doSomeThing(str));
    }
    else{
        list2.add(doSomethingElse(str));
    }
}

用流替换这个循环很容易吗?我看到的唯一选择是使用两种不同的过滤条件对流进行两次迭代。

【问题讨论】:

  • 如果您的代码正常工作,您为什么要这样做?
  • 您可以使用带有条件语句List<String> list2 = list.stream().map(str -> someCondition(str) ? doSomeThing(str) : doSomethingElse(str)).collect(toList()); 的地图。它是否更具可读性取决于读者(我个人觉得很清楚)。如果需要,您可以随时将此过程提取到辅助方法中。
  • @fge 只是为了更好地理解 Java 中的函数式编程:)

标签: java functional-programming java-8


【解决方案1】:

听起来你可以只使用 map 一个条件:

List<String> list2 = list
    .stream()
    .map(str -> someCondition(str) ? doSomething(str) : doSomethingElse(str))
    .collect(Collectors.toList());

将短字符串映射为小写,将长字符串映射为大写的简短但完整的示例:

import java.util.*;
import java.util.stream.*;

public class Test {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("abC", "Long Mixed", "SHORT");
        List<String> list2 = list
            .stream()
            .map(str -> str.length() > 5 ? str.toUpperCase() : str.toLowerCase())
            .collect(Collectors.toList());
        for (String result : list2) {
            System.out.println(result); // abc, LONG MIXED, short
        }
    }
}

【讨论】:

  • 因为我们在做 Java 8,我们也可以这样写日志:list2.forEach(System.out::println);
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
相关资源
最近更新 更多