Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环内的条件操作,java 8路_Java_Java 8 - Fatal编程技术网

循环内的条件操作,java 8路

循环内的条件操作,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循环,它根据循环对象的值运行不同的方法。简单的Java老方法是这样的

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());