java8新增一種流式數據,讓操作集合數據更簡單方便。
定義基本對象:
public class Peo { private String name; private String id; public Peo() { super(); } public Peo(String name, String id) { super(); this.name = name; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
1.toMap的使用
使用toMap方法將list集合轉出對應的map
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Stemap { public static void main(String[] args) { List<Peo> list = new ArrayList<>(); list.add(new Peo("a", "1")); list.add(new Peo("b", "2")); list.add(new Peo("c", "3")); list.add(new Peo("d", "4")); Map<String, Peo> map = list.stream().collect(Collectors.toMap(Peo::getId, s -> s));
//獲取單字段集合 List<String> names = list.stream().map(e -> e.getName).collect(Collectors.toList()); map.keySet().forEach(s->{ System.out.println(s); }); } }
使用
Collectors.toMap方法將list轉成Map,key = Id,value = Peo對象
注意key值不能有重復,如果有重復就會報錯,為了解決這種問題,我們可以使用以下的寫法:
Map<String, Peo> map = list.stream().collect(Collectors.toMap(Peo::getId, s -> s,(s1,s2)->s1));
多加的一個方法(s1,s2)->s1,是指當遇到key值相同時,value使用已經添加的,忽略后面的對象,如果這么寫(s1,s2)->s2,將會把后面的對象替換到map中,如下:
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Stemap { public static void main(String[] args) { List<Peo> list = new ArrayList<>(); list.add(new Peo("a", "1")); /* list.add(new Peo("b", "2")); list.add(new Peo("c", "3")); list.add(new Peo("d", "4"));*/ list.add(new Peo("e", "1")); Map<String, Peo> map1 = list.stream().collect(Collectors.toMap(Peo::getId, s -> s,(s1,s2)->s1)); System.out.println(map1.get("1").getName()); Map<String, Peo> map2 = list.stream().collect(Collectors.toMap(Peo::getId, s -> s,(s1,s2)->s2)); System.out.println(map2.get("1").getName()); /*map1.values().forEach(s->{ System.out.println(s); });*/ } }
輸出如下:
2.groupBy
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Stemap { public static void main(String[] args) { List<Peo> list = new ArrayList<>(); list.add(new Peo("a", "1")); list.add(new Peo("b", "2")); list.add(new Peo("c", "3")); list.add(new Peo("d", "4")); list.add(new Peo("e", "1")); Map<String, List<Peo>> map1 = list.stream().collect(Collectors.groupingBy(Peo::getId)); System.out.println("map 數量:"+map1.size()); System.out.println("key = 1 數量:"+map1.get("1").size()); map1.get("1").forEach(p ->{ System.out.println(p.getName()); }); /*map1.values().forEach(s->{ System.out.println(s); });*/ } }
輸出如下:
我們可以通過groupBy方法對list數據分組,指定分組的key。
3.filter
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class Stemap { public static void main(String[] args) { List<Peo> list = new ArrayList<>(); list.add(new Peo("a", "1")); list.add(new Peo("b", "2")); list.add(new Peo("c", "3")); list.add(new Peo("d", "4")); list.add(new Peo("e", "1")); list = list.stream().filter(peo -> "1".equals(peo.getId())).collect(Collectors.toList());; list.forEach(p ->{ System.out.println(p.getName()); }); /*map1.values().forEach(s->{ System.out.println(s); });*/ } }
輸出:
可用通過filter過濾出滿足一定條件的數據。
后續還有關於distinct、limit、skip、allMatch等等方法,后面繼續補充