• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Java 8 将List转换为Map

jdk8 来源:最后的miku殿下 1次浏览

几个Java 8示例来向您展示如何将一个List对象转换为一个Map,以及如何处理重复的键

Hosting.java

package com.mkyong.java8  public class Hosting {   private int Id; private String name; private long websites;  public Hosting(int id, String name, long websites) {  Id = id; this.name = name; this.websites = websites; }  //getters, setters and toString() }

List到Map – Collectors.toMap()

创建Hosting对象的List,Collectors.toMap并将其转换为Map。

TestListMap.java

package com.mkyong.java8  import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors;  public class TestListMap {   public static void main(String[] args) {   List<Hosting> list = new ArrayList<>(); list.add(new Hosting(1, "liquidweb.com", 80000)); list.add(new Hosting(2, "linode.com", 90000)); list.add(new Hosting(3, "digitalocean.com", 120000)); list.add(new Hosting(4, "aws.amazon.com", 200000)); list.add(new Hosting(5, "mkyong.com", 1));  // key = id, value - websites Map<Integer, String> result1 = list.stream().collect( Collectors.toMap(Hosting::getId, Hosting::getName));  System.out.println("Result 1 : " + result1);  // key = name, value - websites Map<String, Long> result2 = list.stream().collect( Collectors.toMap(Hosting::getName, Hosting::getWebsites));  System.out.println("Result 2 : " + result2);  // Same with result1, just different syntax // key = id, value = name Map<Integer, String> result3 = list.stream().collect( Collectors.toMap(x -> x.getId(), x -> x.getName()));  System.out.println("Result 3 : " + result3); } }

Output

Result 1 : { 1=liquidweb.com, 2=linode.com, 3=digitalocean.com, 4=aws.amazon.com, 5=mkyong.com}
Result 2 : { liquidweb.com=80000, mkyong.com=1, digitalocean.com=120000, aws.amazon.com=200000, linode.com=90000}
Result 3 : { 1=liquidweb.com, 2=linode.com, 3=digitalocean.com, 4=aws.amazon.com, 5=mkyong.com}

2.列出Map – 重复键

2.1运行下面的代码,重复的关键错误将被抛出!

TestDuplicatedKey.java

package com.mkyong.java8;  import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors;  public class TestDuplicatedKey {   public static void main(String[] args) {   List<Hosting> list = new ArrayList<>(); list.add(new Hosting(1, "liquidweb.com", 80000)); list.add(new Hosting(2, "linode.com", 90000)); list.add(new Hosting(3, "digitalocean.com", 120000)); list.add(new Hosting(4, "aws.amazon.com", 200000)); list.add(new Hosting(5, "mkyong.com", 1));  list.add(new Hosting(6, "linode.com", 100000)); // new line  // key = name, value - websites , but the key 'linode' is duplicated!? Map<String, Long> result1 = list.stream().collect( Collectors.toMap(Hosting::getName, Hosting::getWebsites));  System.out.println("Result 1 : " + result1);  } }

输出 – 下面的错误信息有点误导,应该显示“linode”而不是键的值。

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 90000
	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1245)
	//...

2.2要解决上述重复的关键问题,请传入第三个mergeFunction参数,如下所示:

Map<String, Long> result1 = list.stream().collect( Collectors.toMap(Hosting::getName, Hosting::getWebsites, (oldValue, newValue) -> oldValue ) );

Output

Result 1 : { ..., aws.amazon.com=200000, linode.com=90000}

3.3尝试newValue

Map<String, Long> result1 = list.stream().collect( Collectors.toMap(Hosting::getName, Hosting::getWebsites, (oldValue, newValue) -> newvalue ) );

Output

Result 1 : { ..., aws.amazon.com=200000, linode.com=100000}

3.列出Map- 排序Collect

TestSortCollect.java

package com.mkyong.java8;  import java.util.*; import java.util.stream.Collectors;  public class TestSortCollect {   public static void main(String[] args) {   List<Hosting> list = new ArrayList<>(); list.add(new Hosting(1, "liquidweb.com", 80000)); list.add(new Hosting(2, "linode.com", 90000)); list.add(new Hosting(3, "digitalocean.com", 120000)); list.add(new Hosting(4, "aws.amazon.com", 200000)); list.add(new Hosting(5, "mkyong.com", 1)); list.add(new Hosting(6, "linode.com", 100000));  //example 1 Map result1 = list.stream() .sorted(Comparator.comparingLong(Hosting::getWebsites).reversed()) .collect( Collectors.toMap( Hosting::getName, Hosting::getWebsites, // key = name, value = websites (oldValue, newValue) -> oldValue, // if same key, take the old key LinkedHashMap::new // returns a LinkedHashMap, keep order ));  System.out.println("Result 1 : " + result1);  } }

Output

Result 1 : { aws.amazon.com=200000, digitalocean.com=120000, linode.com=100000, liquidweb.com=80000, mkyong.com=1}






版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)