当前位置: 首页 > 知识库问答 >
问题:

只使用两个键和奇偶列表索引作为值将列表转换为映射-Java 8 Stream

范安歌
2023-03-14

我想把列表转换成地图使用作为关键值只有两个字符串值。然后作为值,从输入列表中只列出包含奇数或偶数索引位置的元素的字符串列表。以下是旧的时尚代码:

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));
}

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

{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}}

共有1个答案

罗昕
2023-03-14

您在索引上进行流式传输是正确的:

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())
        ));
 类似资料:
  • 我正在尝试学习如何使用Java 8的集合,我想知道是否有一种方法将我的列表转换成一个地图使用Java流。 我想知道如何使用流将上面的列表创建到一个映射中。我知道如何将foreach etc与puts一起使用,但我只是想知道是否有更优雅的方法使用流构建映射。(我知道下面的语法不正确,我是流的新手,不知道怎么写) 目标是代表以下内容。

  • 使用Java8 streams,我希望将列表转换为映射,如Java8 list into map 解决方案中所述。但是,我希望过滤以删除具有某些键的条目(例如,如果键为空),而不需要将值转换为键两次。

  • 问题内容: 我正在尝试转换以下列表: 像这样的字典: 我尝试了其他职位的答案,但没有任何帮助。我现在有以下代码: 这给了我这个错误: 任何帮助深表感谢。谢谢。 问题答案: 您可以从内置的枚举中获取列表的索引。您只需要反转索引值映射并使用字典理解来创建字典 哦,永远不要将变量命名为内置变量或类型。

  • 我是Mapstruct的新手。我试图将列表转换为地图,我在网上搜索了很多,我有一些解决方案,比如它还没有在mapstruct中实现。如果有人能提供一些替代解决方案,我将很高兴。所有我希望转换映射如下: 现在是否可以使用MapStruct来实现?

  • 我已经创建了一种计算字母表中每个字符的方法。我正在学习流(函数式编程),并尝试尽可能经常地使用它们,但我不知道在这种情况下该怎么做:

  • 问题内容: 我想将 每个地图条目转换为-列表中的1个条目作为“键-值” 我搜索了,只发现将值仅映射到List。 我希望将此映射到列表为 等等。 如果我使用foreach,可以很容易地做到这一点,但是我想知道通过流获取它是否可行 问题答案: