循环内的条件操作,java 8路
我有一个for循环,它根据循环对象的值运行不同的方法。简单的Java老方法是这样的循环内的条件操作,java 8路,java,java-8,Java,Java 8,我有一个for循环,它根据循环对象的值运行不同的方法。简单的Java老方法是这样的 for(Object obj : inputList){ if(1 == obj.intVar){ executeFirst(); } else if (2 == obj.intVar) { executeSecond(); } else { executeDefault(); } } 或者使用一个简单的开关盒 我知道我可以在Jav
for(Object obj : inputList){
if(1 == obj.intVar){
executeFirst();
} else if (2 == obj.intVar) {
executeSecond();
} else {
executeDefault();
}
}
或者使用一个简单的开关盒我知道我可以在Java8中使用如下内容。但对我来说,它似乎是Java7和Java8之间的融合。我不确定我是否可以在这里使用过滤器/map/reduce,因为其目的不是数据操纵,而是派生特定的行为。我们有没有办法用纯Java8的方式来实现这一点,或者这就是实现这一点的方式
inpultList.stream().forEach(obj -> {
if(1 == obj.intVar){
executeFirst();
} else if (2 == obj.intVar) {
executeSecond();
} else {
executeDefault();
}
});
提前感谢。如果您坚持使用流API,您可以这样做
inputList.stream().filter(obj -> obj.intVar == 1).forEach(this::executeFirst);
inputList.stream().filter(obj -> obj.intVar == 2).forEach(this::executeSecond);
inputList.stream().filter(obj -> obj.intVar > 2).forEach(this::executeDefault);
这就是说:您应该始终坚持最具可读性和可维护性的内容—可用的语言特性并不意味着您必须使用它。在你的情况下,我会坚持“简单的旧Java”方式。你的方法不错,我建议只是避免使用
流,你不需要它
inpultList.forEach(l -> {
if (l.intVar == 1) executeFirst();
else if (l.intVar == 2) executeSecond();
else executeDefault();
});
我不同意@Kayaman,我不认为尝试使用Java8表达式是浪费时间,因为它们允许我们可以轻松地将收集处理分布到多个线程上
但是,我不鼓励在这种情况下使用过滤器
,因为您将多次查看同一列表。对于您的简单示例,这可能有点设计过度,但一般的解决方案是使用带有处理程序的映射
:
Map<Integer,Runnable> handlers = new HashMap<>();
handlers.put(1, () -> executeFirst());
handlers.put(2, () -> executeSecond());
或
在这个例子中,我看不出使用流有什么意义,但是switch语句似乎比if更好。而且,1==obj.intVar
是非常规的,与obj.intVar==1
相比没有任何优势。这不是C。整数不是布尔数<代码>如果(obj.intVar=1)
将无法编译。Java 8没有更改语言的基本功能。对于循环,它肯定没有改变。如果你坚持用“纯Java 8方式”编写东西,你只会在不相关的语法修改上浪费宝贵的开发时间。这些关于将循环转换为流的问题应该解决,但这并不是一回事:执行顺序不同,第三个条件与原始代码中的条件不同。
inputList.stream()
.map(obj -> handlers.getOrDefault(obj.intVar, () -> executeDefault()))
.forEach(Runnable::run);
inputList.forEach(obj -> handlers.getOrDefault(obj.intVar, () -> executeDefault()).run());