java 8在" forky"中使用流方式

时间:2017-05-24 13:18:02

标签: 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))

我遍历一份员工名单,并希望他们设置一个优先权标志,如果他们住在一个危险等级为5或更高的国家的城市。

我喜欢像上面这样的流程,但却找不到办法。我不被允许&#34;沿着城市,国家,危险等级进一步流动,最终我需要我开始的员工对象,为他设置旗帜。

我只懂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路走下去之后,我无法回到我的主流&#34;。

2 个答案:

答案 0 :(得分:6)

最简单的解决方案是链接方法调用,就像在Kayaman’s answer中一样。

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步骤链,我会留下一系列普通的方法调用。

答案 1 :(得分:4)

不,因为流正在通过Stream<Employee>操作从Stream<Integer>更改为map()(毕竟,这是map()应该执行的操作,并且没有{ {1}})。

你只能用

来做
unmap()

这很难看,但保留了原来的employees.stream(). filter(e -> e.getCity().getCountry().determineHazardLevel() > 5). forEach(...) 。对于“不太丑陋”的代码,请在Stream<Employee>中实现determineHazardLevel()