有没有办法将double`for`循环更改为java8的lamda表达式?

时间:2017-08-11 16:43:43

标签: java lambda java-8

例如

 Map<String, List<String>> headers = connection.getHeaderFields();

    for (String key: headers.keySet()){
        for (String value: headers.get(key)){
            System.out.println(key+":"+value);
        }
    }

这段代码可以这样更改为(方法参考)吗?

Consumer<String> consumer = headers::get;
headers.keySet().forEach(consumer);

但这不正确。我认为有办法做到这一点:

  1. Consumer<String> consumer = headers::get;
  2. BiConsumer<String, String> header = (key, value) -> System.out.println(key+":"+value);
  3. 结合1,2
  4. 我的确是对的吗?

3 个答案:

答案 0 :(得分:2)

看起来您可以使用flatMap

headers.entrySet().stream()
  .flatMap(k -> k.getValue().stream().map(v -> k + ":" + v))
  .forEach(System.out::println);

关于ConsumerBiConsumer的问题,它完全错过了 - 这些只是功能接口,只能用于表示功能 - 它们需要传递到某个地方才能使用

答案 1 :(得分:0)

首先,将这些for循环更改为地图条目上的循环以提高效率(Q&A on iterating maps in Java):

for (Map.Entry<String, List<String>> entry : headers.entrySet()){
    for (String value: entry.getValue()){
        System.out.println(entry.getKey()+":"+value);
    }
}

现在您已准备好将其转换为基于流的迭代:

headers.entrySet().forEach(entry -> {
    entry.getValue().forEach(value -> System.out.println(entry.getKey()+":"+value))
});

答案 2 :(得分:0)

你可以使用这样的东西

headers.forEach((key, value) -> {
        value.forEach((current) -> {
            System.out.println(key + ":" + current);
        });
    });