List转特点条件的Map

一个key的集合List1 {A ,B ,C}
一个对象的集合List2,对象的某个字段为A
问:

如何实现 List2.stream().collect(Collectors.groupingBy()) 的结果的key为List1中的值,value为字段A中的like结果

如结果:
A->{A1,Acd,A!}
B->{B1,B32}
c->{C1,C/*-}


Map<String, List<String>> result = list2.stream()
                .filter(o -> list1.contains(o.getField()))
                .collect(Collectors.groupingBy(
                        o -> o.getField(),
                        Collectors.mapping(
                                o -> o.getA().like(...), // 字段A的like操作
                                Collectors.toList()
                        )
                ));

其中,list1为List类型,表示需要按照哪些值进行分组;list2为List类型,表示需要分组的对象列表,每个对象包含两个字段:field和A,分别表示分组的依据和需要进行like操作的字段。

在Stream流中,首先使用filter方法过滤掉不在list1中的元素,然后使用Collectors.groupingBy方法按照field字段进行分组。groupingBy方法有两个参数:第一个参数是分类函数,用于指定分组的依据;第二个参数是downstream collector,用于对每个分组的元素进行处理。在这里,我们使用了Collectors.mapping方法,将每个元素的A字段进行like操作,并将结果转换成List,最后作为value返回给上层groupingBy方法。最终得到的结果是一个Map<String, List>类型,其中key为list1中的值,value为字段A经过like操作后的结果。

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以给出参考代码:

    public static Map> listToMap(List list, Function keyExtractor) { return list.stream().collect(Collectors.groupingBy(keyExtractor)); }

    这是一个通用的方法,使用Stream API来实现List转换成Map的功能。第一个参数是要转换的List,第二个参数是一个Function,用于提取作为Map的key的值。这里使用了groupingBy方法,它会将List里的元素进行分组,分组后的每个子集合会以其所属的组(上述代码中是keyExtractor提取的值)为key,整个Map就是这些分组的所有结果。这样的话,如果List里有相同的key,它们会合并到一个List中。

    如果要添加参数或条件来进行过滤、排序或其他操作,可以在使用这个方法之前对List进行预处理,再把处理后的List传给这个方法。例如,可以使用filter方法进行过滤,使用sorted方法进行排序,然后再使用上述方法将List转换为Map。

    示例代码:

    // 假设List1和List2已经存在并赋值 ListfilteredList = List2.stream() .filter(obj -> obj.getSomeValue() > 10) // 过滤 .sorted(Comparator.comparingInt(obj -> obj.getAnotherValue())) // 排序 .collect(Collectors.toList()); Map> resultMap = listToMap(filteredList, obj -> obj.getKey()); // 转换成Map

    这里使用了Java 8的Lambda表达式,filter和sorted方法是Stream API中的一部分,可以实现各种复杂的过滤和排序操作。最后,把处理过的List传给listToMap方法,就可以得到最终的Map结果了。

有帮助的话 采纳一下


List<String> list1 = Arrays.asList("A", "B", "C");

List<Bean> list2 = Arrays.asList(
    new Bean("A1", "A"), 
    new Bean("Acd", "A"),
    new Bean("A!", "A"),
    new Bean("B1", "B"),
    new Bean("B32", "B"),
    new Bean("C1", "C"),
    new Bean("C/*-", "C") 
);

Map<String, List<Bean>> result = list2.stream().collect(
    Collectors.groupingBy(bean -> {
        if (list1.contains(bean.getKey())) {
            return bean.getKey();
        }
        return null;
    })
);

System.out.println(result);
public class Bean {
    private String name;
    private String key;

    public Bean(String name, String key) {
        this.name = name;
        this.key = key;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}