我仍在计算 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/