BAE*_*RUS 3 java java-8 java-stream
我很好奇,如果它在某种程度上可能,并不总是直接在一个流中.想象一下这个示例代码:
List<Employee> employees = [...];
employees.stream()
.map(Employee::getCity)
.map(City::getCountry)
.map(countryService::determineHazardLevel)
.filter(level -> level > 5) // integer
// this line not possible anymore as I drifted away from my employees ...
.forEach(employee -> employee.setPriority(HIGH))
Run Code Online (Sandbox Code Playgroud)
我迭代一份员工名单,并希望他们设置一个优先权标志,如果他们住在一个危险等级为5或更高的国家的城市.
我喜欢像上面那样走上小道,但找不到办法去做.我"不被允许"沿着城市,国家,危险等级进一步流动,最终我需要我开始的员工对象,在他身上设置旗帜.
我只知道Java,所以我甚至不知道在其他可能更实用的编程语言中是否真的可以实现.
我可以使用以下代码作为解决方法,但它会更清洁:
List<Employee> employees = [...];
employees.stream()
.forEach(employee -> {
Optional<Integer> lvl = Optional.of(employee)
.map(Employee::getCity)
.map(City::getCountry)
.map(countryService::determineHazardLevel)
.filter(level -> level > 5); // integer
lvl.ifPresent(employee.setPriority(HIGH));
}
Run Code Online (Sandbox Code Playgroud)
也许我只是把它弄得一塌糊涂,需要把它看得完全不同......
PS:我刚刚在记事本中写了这些东西,不确定我是否犯了一些错误,但我希望这个想法能够实现.简单地说,我看起来像这样:普通的流是像这样的命令A, B, C, D.但我想做的是A, B, B1, B2, B3, C, D.但是沿着B路走下去后,我无法回到我的"主流".
最简单的解决方案是链式方法调用,就像Kayaman的答案一样.
employees.stream()
.filter( employee -> employee.getCity().getCountry().determineHazardLevel() > 5).
.forEach(employee -> employee.setPriority(HIGH))
Run Code Online (Sandbox Code Playgroud)
或者,您可以在内部操作中使用流步骤:
employees.stream()
.filter( employee -> Stream.of(employee)
.map(Employee::getCity)
.map(City::getCountry)
.mapToInt(countryService::determineHazardLevel)
.anyMatch(level -> level > 5))
.forEach(employee -> employee.setPriority(HIGH))
Run Code Online (Sandbox Code Playgroud)
但是对于一个简单的map步骤链,我会留下一系列普通的方法调用.