Java 8 关于将字符串列表更改为每个元素和其他元素的映射列表

Java 8 关于将字符串列表更改为每个元素和其他元素的映射列表,java-8,Java 8,有一个列表:[“aaa”、“bbb”、“ccc”] 我想把它转换成下面的结构 [{ main = aaa, others = [bbb, ccc] }, { main = bbb, others = [aaa, ccc] }, { main = ccc, others = [aaa, bbb] }] 现在我的方式是 List<String> list = newArrayList("aaa", "bbb", "ccc"); List&

有一个列表:[“aaa”、“bbb”、“ccc”]

我想把它转换成下面的结构

[{
    main = aaa,
    others = [bbb, ccc]
}, {
    main = bbb,
    others = [aaa, ccc]
}, {
    main = ccc,
    others = [aaa, bbb]
}]
现在我的方式是

List<String> list = newArrayList("aaa", "bbb", "ccc");
List<ImmutableMap<String, Object>> mainAndOthersList = list.stream().map(s -> ImmutableMap.of("main", s, "others", list.stream().filter(s2 -> !s2.equals(s)).collect(toList()))).collect(toList());
System.out.println(mainAndOthersList);
List List=newArrayList(“aaa”、“bbb”、“ccc”);
List main和otherslist=List.stream().map(s->ImmutableMap.of(“main”,s,“others”,List.stream().filter(s2->!s2.equals(s)).collect(toList()).collect(toList());
System.out.println(Main和OthersList);

是否有其他方式来实现它?

如果
列表中的元素不是字符串,并且可以使用
java-9
,则基本上可以在索引上执行相同的操作:

List<Map<String, Object>> result = IntStream.range(0, list.size())
            .mapToObj(x -> Map.of(
                    "main",
                    list.get(x),
                    "others",
                    IntStream.range(0, list.size()).filter(y -> y != x).mapToObj(list::get).collect(Collectors.toList())))
            .collect(Collectors.toList());
List result=IntStream.range(0,List.size())
.mapToObj(x->Map.of(
“主要”,
列表。获取(x),
“其他”,
IntStream.range(0,list.size()).filter(y->y!=x).mapToObj(list::get).collect(Collectors.toList()))
.collect(Collectors.toList());

但请注意,这与您已经在做的事情非常接近

这里有一个没有流的替代方案,主观上更容易或更难阅读

List<String> list = Arrays.asList("aaa", "bbb", "ccc");
List<Map<String,Object>> result = new ArrayList<>();
for(int i = 0; i < list.size(); i++) {
    Map<String,Object> map = new HashMap<>();
    List<Object> innerList = new ArrayList<>(list);
    map.put((String)innerList.remove(i), innerList);
    result.add(map);
}
List List=Arrays.asList(“aaa”、“bbb”、“ccc”);
列表结果=新建ArrayList();
对于(int i=0;i
有很多方法。你的方式似乎是个不错的选择。@Eugene很抱歉,你的方式没有太多的灵感