java8 stream常用操作
阿新 • • 發佈:2022-03-19
其實使用Java8很多年了,雖然一直也在用集合的stream操作,但是一直沒有總結,今天就將stream的常用操作做一個總結,
至於stream的概念不會過多介紹,直接給出常用操作的案例,當然也是博主用的比較多的,後面有其他用法,也會補充進來
廢話不多說,直接上程式碼:
package org.dudu.test;
import org.junit.Before;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
/**
* Java8 stream常用方法
*/
public class StreamTestDemo {
private List<User> userList;
@Before
public void createUserList(){
userList = new ArrayList<User>();
User user1 = new User("張三",20);
User user2 = new User("李四",25);
User user3 = new User("王五",30);
User user4 = new User("王麻子",32);
User user5 = new User("老王",30);
User user6 = new User("老李",25);
User user7 = new User("老張",30);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
userList.add(user7);
}
/**
* 常規操作
*/
//@Test
public void streamCommon(){
/**
* Java8 stream常規用法
*/
userList.stream().forEach((user) -> System.out.println(user.getAge()));
}
/**
* 過濾
*/
@Test
public void streamFilter(){
/**
* 過濾操作,篩選出年齡30的使用者,組裝成一個list<user>
*/
List<User> userMap = userList.stream().filter((user) -> user.getAge() == 30).collect(Collectors.toList());
userMap.stream().forEach(System.out::println);
}
/**
* 對映
*/
@Test
public void streamMap(){
/**
* 給其中每個使用者的年齡增加5歲
*/
List<User> userMap = userList.stream().map(user -> { user.setAge(user.getAge() + 5);return user;}).collect(Collectors.toList());
userMap.stream().forEach(System.out::println);
}
/**
* 對映
*/
@Test
public void streamMapsum(){
/**
* 計算給定使用者的年齡和
*/
int sumAges = userList.stream().mapToInt(User::getAge).sum();
System.out.println(sumAges);
}
/**
* 排序
*/
@Test
public void streamSort(){
/**
* 按照年齡從小到達排序(常規操縱)
*/
List<User> userMap = userList.stream().sorted((user1,user2) -> {return user1.getAge() - user2.getAge();}).collect(Collectors.toList());
userMap.stream().forEach(System.out::println);
}
/**
* 排序
*/
@Test
public void streamSort1(){
/**
* 除了上面常規的排序外,
* 我們也可以在sorted通過函式式處理
*/
//預設從小到大
// List<User> userMap = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
//從大到小
List<User> userMap = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
userMap.stream().forEach(System.out::println);
}
/**
* 統計
*/
//@Test
public void streamCollect(){
/**
* 實際當中我們需要聚合操作,比如將該示例中,將年齡相同的使用者分組
* 其實就是需要構造一個Map<Integer,List<User>>的陣列結構,這個時候
* 可以使用stream的collect中的分組操作
*/
Map<Integer,List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getAge));
userMap.keySet().stream().forEach((age) -> {
System.out.println(age);
System.out.println(Arrays.toString(userMap.get(age).toArray()));
});
}
/**
* 統計
*/
//@Test
public void streamCollect1(){
/**
* 工作中,有時候需要將某個集合中的屬性,構造成一個集合
* 比如本例中,需要將age屬性構造成一個list<Integer>
*/
List<Integer> ages = userList.stream().map(User::getAge).collect(Collectors.toList());
System.out.println(Arrays.toString(ages.toArray()));
}
private class User {
private String userName;
private int age;
public User(String userName, int age) {
this.userName = userName;
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString(){
return this.getUserName() + ";" + this.getAge();
}
}
}