Java lambda 循环

标签 java lambda java-8 java-stream

我仍在计算 lambda,并且我想知道一种方法。

private enum Result
{
    RESULT1,
    RESULT2,
    RESULT3
}
public static Map<String, Result> calculateResults(List<String> list)
{
    Map<String, Result> map = new HashMap<>(list.size());
    List<String> leavings = new ArrayList<>(list);

    map.putAll(leavings.stream().filter(Main::firstFilter).collect(Collectors.toMap(s -> s, s -> Result.RESULT1)));
    leavings.removeAll(map.keySet());

    map.putAll(leavings.stream().filter(Main::secondFilter).collect(Collectors.toMap(s -> s, s -> Result.RESULT2)));
    leavings.removeAll(map.keySet());

    map.putAll(leavings.stream().filter(Main::thirdFilter).collect(Collectors.toMap(s -> s, s -> Result.RESULT3)));
    leavings.removeAll(map.keySet());

    return map;
}
private static boolean firstFilter(String s)
{
    return s.length() == 5;
}
private static boolean secondFilter(String s)
{
    return s.contains("A");
}
private static boolean thirdFilter(String s)
{
    return BlockedStrings.getInstance().contains(s);
}

我认为如果这可以在某种循环中实现,那就太棒了,但我不知道如何编码。是否可以将过滤器谓词分配给枚举变量或执行其他操作以使其不那么可重复?

最佳答案

我不确定我是否理解了你的意图,但对我来说,看起来你想做的是:

public static Map<String, Result> calculateResults(List<String> list) {
    return list.stream().filter(s -> firstFilter(s)||secondFilter(s)||thirdFilter(s))
        .collect(Collectors.toMap(s -> s, s -> firstFilter(s)? Result.RESULT1:
                              secondFilter(s)? Result.RESULT2: Result.RESULT3));
}

这具有多次评估谓词的缺点。另一种方法是将评估结果存储到临时对象中:

public static Map<String, Result> calculateResults(List<String> list) {
    return list.stream().map(s -> new AbstractMap.SimpleImmutableEntry<>(s,
            firstFilter(s)? Result.RESULT1: secondFilter(s)? Result.RESULT2:
            thirdFilter(s)? Result.RESULT3: null))
        .filter(e -> e.getValue()!=null)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

关于Java lambda 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40365838/

相关文章:

java-8 - javac -parameters 标志的缺点

java - Spring Cloud Config使用git从本地gitlab获取配置失败

linq - 如何在 Linq lambda 表达式中使用 'select new'?

java - 安卓工作室版本3.1.1

lambda - 将翻转 lambda 转换为 SKI 项

python - 如何在python case语句中运行代码块

java - 流上的 reduce() 操作似乎正在修改数据源(列表)Stream API Java 8

java - 如何对属于两个或多个组的列表中的对象进行分组?

java - IntelliJ 和 Maven 源文件夹问题

java - OGNL 语法问题