[英]java 8 use streams in a “forky” way
我很好奇,如果它在某种程度上可能,并不总是直接在一个流中。 想象一下这个示例代码:
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))
我迭代一份员工名单,并希望他们设置一个优先权标志,如果他们住在一个危险等级为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));
}
也许我只是把它弄得一塌糊涂,需要把它看得完全不同......
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))
或者,您可以在内部操作中使用流步骤:
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))
但是对于一个简单的map
步骤链,我会留下一系列普通的方法调用。
不,因为流正在通过map()
操作从Stream<Employee>
更改为Stream<Integer>
(毕竟,这就是map()
应该执行的操作,并且没有unmap()
)。
你只能这样做
employees.stream().
filter(e -> e.getCity().getCountry().determineHazardLevel() > 5).
forEach(...)
这很难看,但保留了原始的Stream<Employee>
。 对于“不那么难看”的代码,也要在Employee
实现determineHazardLevel()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.