Java Stream流 List< T >轉(zhuǎn)換Map方法匯總合集(大概是最全吧)
本文主要介紹 Java 中利用 Stream 流將 List< T > 類型數(shù)據(jù)轉(zhuǎn)換成 Map 類型的幾種方法整合匯總,其中包含了toMap()、groupingBy()、partitioningBy()等方法的使用,建議收藏方便查閱,如果有幫助到您,不要吝嗇點(diǎn)贊、收藏!
tips:本文沒有推薦使用三方類庫提供的 List 轉(zhuǎn) Map 工具類方法,因?yàn)樵诓┲鞴疽肴揭蕾囆枰谠u審時(shí)說出引用原因,哈哈哈(太麻煩),當(dāng)然有很多好用三方工具類可以直接完成 List 轉(zhuǎn) Map 的操作,如有需要,后續(xù)博主會單獨(dú)寫一篇三方類庫的 List 轉(zhuǎn) Map 工具類方法博文提供給大家。
??????您的點(diǎn)贊、收藏、評論是博主輸出優(yōu)質(zhì)文章的的動力?。?!??????
以下示例會覆蓋工作中絕大部分的使用場景,如有沒有覆蓋到的場景,后續(xù)會基于本文持續(xù)更新??!所以大家一定要收藏!點(diǎn)贊!歡迎在評論區(qū)與博主溝通交流??!???? ???? ????
List< String > -> Map< String,List< String>>
示例一
通過Stream流完成轉(zhuǎn)換:
@Test
public void testList1() {
List<String> list = Arrays.asList("s1:01", "s2:02", "s3:03", "s4:04");
Pattern DELIMITER = Pattern.compile(":");
Map<String, List<String>> map = list.stream().map(DELIMITER::split)
.collect(Collectors.groupingBy(a -> a[0],
Collectors.mapping(a -> a[1], Collectors.toList())));
System.out.println(JSONObject.toJSONString(map));
}
運(yùn)行結(jié)果:
示例二
通過forEach循環(huán)轉(zhuǎn)換:
@Test
public void testList1() {
List<String> list = Arrays.asList("s1:01", "s2:02", "s3:03", "s4:04");
Map<String, Set<String>> map = new HashMap<>();
list.forEach(location -> {
String[] strArr = location.split(":");
map.compute(strArr[0], (country, codes) -> {
codes = codes == null ? new HashSet<>() : codes;
codes.add(strArr[1]);
return codes;
});
});
System.out.println(JSONObject.toJSONString(map));
}
運(yùn)行結(jié)果:
List< T > -> Map< T, T >
List< Integer> -> Map< Integer,Integer>
代碼示例(本示例是存在重復(fù)key,并且會以首個(gè)出現(xiàn)的 key 去覆蓋后面出現(xiàn)的沖突 key):
@Test
public void testList2() {
List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 4, 5, 6, 7, 8);
Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(k -> k, v -> v, (k1, k2) -> k1));
System.out.println("collect:" + collect);
}
toMap()無重復(fù)key
示例一
List泛型為 Student
對象,示例需要將name屬性作為 key,age 屬性作為value;
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Student::getName, Student::getAge));
System.out.println(JSONObject.toJSONString(collect));
}
示例二
List泛型為 Student
對象,示例需要將name屬性作為 key, Student
對象作為value;
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
Map<String, Student> collect = list.stream().collect(Collectors.toMap(Student::getName, student -> student));
System.out.println(JSONObject.toJSONString(collect));
}
運(yùn)行結(jié)果:
toMap()有重復(fù)key
當(dāng)存在重復(fù) key 時(shí),編譯器會報(bào)錯(cuò):java.lang.IllegalStateException: Duplicate key xxxx;
出現(xiàn)這種情況就需要在 toMap()
方法中指定 key 來避免沖突;
示例一
解決辦法:使用第一個(gè)key 覆蓋第二個(gè)key;
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 2),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
Map<String, Student> collect = list.stream().collect(Collectors.toMap(Student::getName, student -> student, (key1, key2) -> key1));
System.out.println(JSONObject.toJSONString(collect));
}
運(yùn)行結(jié)果(保留了 “num”:11 的對象):
示例二
解決辦法:使用第二個(gè)key 覆蓋第一個(gè)key;
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 2),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
Map<String, Student> collect = list.stream().collect(Collectors.toMap(Student::getName, student -> student, (key1, key2) -> key2));
System.out.println(JSONObject.toJSONString(collect));
}
運(yùn)行結(jié)果(保留了 “num”:2 的對象):
toMap()空指針異常
當(dāng) value 為空時(shí),使用 toMap()
方法進(jìn)行轉(zhuǎn)換,編譯器會拋出 java.lang.NullPointerException;
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29),
new Student("小田", null, DateUtil.parse("2007-02-21 22:18:56"), null));
Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Student::getName, Student::getAge));
System.out.println(JSONObject.toJSONString(collect));
}
運(yùn)行結(jié)果:
解決辦法一
轉(zhuǎn)換時(shí)增加判斷,如果是null,則設(shè)置默認(rèn)值;
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29),
new Student("小田", null, DateUtil.parse("2007-02-21 22:18:56"), null));
Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Student::getName, s -> s.getAge() == null ? -1 : s.getAge()));
System.out.println(JSONObject.toJSONString(collect));
}
運(yùn)行結(jié)果:
解決辦法二
使用 Optional< T > 對值進(jìn)行包裝(和方式一大同小異,就是換了個(gè)寫法):
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29),
new Student("小田", null, DateUtil.parse("2007-02-21 22:18:56"), null));
Map<String, Integer> collect = list.stream().collect(Collectors.toMap(Student::getName, s -> Optional.ofNullable(s.getAge()).orElse(-1)));
System.out.println("Optional:"+JSONObject.toJSONString(collect));
}
運(yùn)行結(jié)果:
解決辦法三
使用collect(Supplier< R > supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner) 來構(gòu)建,可允許null值的出現(xiàn):
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29),
new Student(null, 12, DateUtil.parse("2007-02-21 22:18:56"), null));
HashMap<Integer, String> collect = list.stream().collect(HashMap::new, (obj, v) -> obj.put(v.getAge(), v.getName()), HashMap::putAll);
System.out.println("collect:" + collect);
}
運(yùn)行結(jié)果:
List< T > -> Map< T, List< T > >
groupingBy()
直接根據(jù)一個(gè)字段或者屬性分組也可以直接用 groupingBy()
方法:
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 2),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
Map<String, List<Student>> collect = list.stream().collect(Collectors.groupingBy(Student::getName));
System.out.println(JSONObject.toJSONString(collect));
}
運(yùn)行結(jié)果:
partitioningBy()
partitioningBy()
可以理解為特殊的 groupingBy()
,key 值為 Boolean類型:
@Test
public void testList2() {
List<Student> list = Lists.newArrayList(
new Student("小張", 17, DateUtil.parse("2006-10-03 15:18:56"), 11),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 5),
new Student("小李", 15, DateUtil.parse("2008-03-19 02:18:56"), 2),
new Student("小王", 16, DateUtil.parse("2007-02-21 22:18:56"), 29));
Map<Boolean, List<Student>> collect = list.stream().collect(Collectors.partitioningBy(s -> s.getNum() >= 5));
System.out.println(JSONObject.toJSONString(collect));
}
運(yùn)行結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-756244.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-756244.html

到了這里,關(guān)于Java Stream流 List< T >轉(zhuǎn)換Map方法匯總合集(大概是最全吧)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!