繁体   English   中英

仅使用两个键和奇数或偶数列表索引作为值将 List 转换为 Map - Java 8 Stream

[英]Transform List into Map using only two keys and odd or even list indexes as values - Java 8 Stream

我想将列表转换为地图,仅使用两个字符串值作为键值。 然后作为值只是包含来自输​​入列表的奇数或偶数索引位置的元素的字符串列表。 这是旧时尚代码:

Map<String, List<String>> map = new HashMap<>();

List<String> list = Arrays.asList("one", "two", "three", "four");

map.put("evenIndex", new ArrayList<>());
map.put("oddIndex", new ArrayList<>());
for (int i = 0; i < list.size(); i++) {
    if(i % 2 == 0)
        map.get("evenIndex").add(list.get(i));
    else 
        map.get("oddIndex").add(list.get(i));
}

如何使用流将此代码转换为 Java 8 以获得此结果?

{evenIndex=[one, three], oddIndex=[two, four]}

我目前的混乱尝试需要修改列表的元素,但绝对是更好的选择。

List<String> listModified = Arrays.asList("++one", "two", "++three", "four");

map = listModified.stream()
           .collect(Collectors.groupingBy(
                               str -> str.startsWith("++") ? "evenIndex" : "oddIndex"));

或者也许有人帮我解决这个不正确的解决方案?

IntStream.range(0, list.size())
         .boxed()
         .collect(Collectors.groupingBy( i -> i % 2 == 0 ? "even" : "odd",
                  Collectors.toMap( (i -> i ) , i -> list.get(i) ) )));

返回这个:

{even={0=one, 2=three}, odd={1=two, 3=four}}

您在对索引进行流式传输时走在正确的轨道上:

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;

IntStream.range(0,list.size())
        .boxed()
        .collect(groupingBy(
                i -> i % 2 == 0 ? "even" : "odd", 
                mapping(list::get, toList())
        ));

如果你同意你的地图被一个boolean索引,你可以使用partitioningBy

IntStream.range(0, list.size())
        .boxed()
        .collect(partitioningBy(
                i -> i % 2 == 0, 
                mapping(list::get, toList())
        ));

您可以使用Collectors.toMap实现相同的目的; 只是为了好玩:

Map<String, List<String>> map = IntStream.range(0, list.size())
            .boxed()
            .collect(Collectors.toMap(
                    x -> x % 2 == 0 ? "odd" : "even",
                    x -> {
                        List<String> inner = new ArrayList<>();
                        inner.add(list.get(x));
                        return inner;
                    },
                    (left, right) -> {
                        left.addAll(right);
                        return left;
                    },
                    HashMap::new));

    System.out.println(map);
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);

Map<String, Integer> map1 = list.stream().collect(Collectors.groupingBy(e -> e % 2 == 0 ? "EvenSum" : "OddSum", Collectors.summingInt(Integer::intValue)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM