stream 使用示例
import one.util.streamex.StreamEx;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class TestStram {
public static void main(String[] args) throws IOException {
List<User> userList=createUserList(100);
//使用List創建流,並使用foreach循環打印出來
userList.stream().forEach(System.out::println);
System.out.println("*****************");
//將userList轉化爲流對象
Stream.of(userList).forEach(System.out::println);
System.out.println("*****************");
//創建一個空流
Stream.empty();
//將兩個流合併起來
System.out.println("*****************");
List<User> userList2=createUserList(100);
List<User> userList3=createUserList(10);
//將兩個流合併起來
Stream.concat(userList2.stream(),userList3.stream()).forEach(System.out::println);
//查找年齡是偶數的user列表
System.out.println("###############");
List<User> userList4=createUserList(100);
userList4.stream().filter(user -> user.getAge()%2==0).collect(Collectors.toList()).forEach(System.out::println);
//找到年齡爲攜帶奇數的user放到Employee列表中
System.out.println("@@@@@@@@@@@@@@@@@@");
List<User> userList5=createUserList(100);
userList5.stream().filter(user ->user.getAge()%2!=0).map(user->{
Employee employee=new Employee();
employee.setEmployeeId(user.getUserId());
employee.setUserName(user.getName());
return employee;
}).peek(System.out::println).collect(Collectors.toList());
//將一個多維的列表轉化爲一個單維的列表,即將,<=30的人一個列表,30>= X<=60爲一個列表,60爲一個列表
System.out.println("&&&&&&&&&&&&&&&&&&&&&&");
List<User> userList6=createUserList(1,30);
List<User> userList7=createUserList(31,60);
List<User> userList8=createUserList(61,90);
List<List<User>> userList9 = new ArrayList<>();
userList9.add(userList6);
userList9.add(userList7);
userList9.add(userList8);
System.out.println(userList9.toString());
userList9.stream().flatMap(Collection::stream).collect(Collectors.toList()).forEach(System.out::println);
System.out.println("+++++++++++++++++++排序++++++++++");
//按照年齡從小到大排序
userList5.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList()).forEach(System.out::println);
//按照年齡從大到小的排序
userList5.stream().sorted(Comparator.comparing(User::getAge).reversed()).peek(System.out::println).collect(Collectors.toList());
//將list列表,先按照年齡從大到小排序,相同年齡的按照id從小到大排序
userList5.stream().sorted(Comparator.comparing(User::getAge).reversed())
.sorted(Comparator.comparing(User::getUserId)).collect(Collectors.toList());
System.out.println("----------------統計--------");
//找出最小的年齡的值
int age=userList5.stream().mapToInt(User::getAge).min().orElse(0);
//找出年齡最小的那個user對象
User user=userList5.stream().min(Comparator.comparing(User::getAge)).orElse(null);
//找出年齡在30歲和50歲之間的列表
userList5.stream().filter(s1->s1.getAge()>=30).filter(s1->s1.getAge()<=50).collect(Collectors.toList());
//找出最大的年齡的值
int maxgae=userList5.stream().mapToInt(User::getAge).max().orElse(0);
//找出年齡最大的那個user對象
User maxUser=userList5.stream().max(Comparator.comparing(User::getAge)).orElse(null);
//計算出所有的年齡的總和
int sumage=userList5.stream().mapToInt(User::getAge).sum();
//計算出所有年齡的平均值
double avgage=userList5.stream().mapToInt(User::getAge).average().orElse(0);
//檢查列表中年齡是不是都大於60
boolean havingAll60=userList5.stream().allMatch(user1 -> user1.getAge()>60);
//檢查列表中的年齡是不是存在60歲的人
boolean havingAny60=userList5.stream().anyMatch(user1 -> user1.getAge()>60);
//檢查列表中必須沒有60歲的纔行
boolean havingNo60=userList5.stream().noneMatch(user1 -> user1.getAge()>60);
//查找出列表中年齡,所有的年齡都減少10歲
List<Integer> userNewAgeList=userList5.stream().map(user1->user1.getAge()-10).collect(Collectors.toList());
//去掉重複對象
List<User> userList1=userList5.stream().distinct().collect(Collectors.toList());
//年齡60歲的用戶只留下一個
List<User> userList10=StreamEx.of(userList5).distinct(user1 -> user1.getAge()>60).toList();
//計算所有人的年齡的總和
int sumage2=userList5.stream().mapToInt(User::getAge).sum();
//另外一種計算所有人的年齡的總和
int sumage3=userList5.stream().map(User::getAge).reduce(Integer::sum).orElse(0);
//將列表中的姓名用,分開
String s=userList5.stream().map(User::getName).collect(Collectors.joining(","));
//將查出來的大於60歲的人的姓名寫在list<String>中
List<String> nameList=userList5.stream().filter(user1 -> user1.getAge()>60).map(User::getName).collect(Collectors.toList());
//將查出來的大於60歲的人的姓名寫在set<User>中
Set<User> userSet=userList5.stream().filter(user1 -> user1.getAge()>60).collect(Collectors.toSet());
//將查出來的大於60歲的人的姓名放在vector<String>中
Vector<String> stringVector = userList5.stream().filter(user1 -> user1.getAge() > 60).map(User::getName).collect(Collectors.toCollection(Vector::new));
//將查出來的大於60歲的人的姓名和年齡放在Map<String,Object> 中
Map<String, Integer> userHa=userList5.stream().filter(user1 -> user1.getAge()>60).collect(Collectors.toMap(User::getName,User::getAge));
//統計列表中大於60歲的人的個數
Long count=userList5.stream().filter(user1 -> user1.getAge()>60).count();
//統計列表中大於60歲的人的個數
LongSummaryStatistics countLongSummaryStatistics=userList5.stream().filter(user1 -> user1.getAge()>60).collect(Collectors.summarizingLong(User::getAge));
System.out.println("countLongSummaryStatistics ==="+countLongSummaryStatistics);
System.out.println("countLongSummaryStatistics count ==="+countLongSummaryStatistics.getCount());
LongSummaryStatistics countLongSummaryStatistics2=userList5.stream().filter(user1 -> user1.getAge()>60).mapToLong(User::getAge).summaryStatistics();
DoubleSummaryStatistics cou = userList5.stream().filter(user1 -> user1.getAge()>60).mapToDouble(User::getAge).summaryStatistics();
System.out.println("countLongSummaryStatistics ==="+cou);
System.out.println("countLongSummaryStatistics count ==="+cou.getCount());
//將list<User> 按照年齡大於30歲分爲兩個分區,
Map<Boolean, List<User>> userListMap=userList5.stream().collect(Collectors.partitioningBy(user1 -> user1.getAge()>30));
System.out.println("大於30歲的userList"+userListMap.get(true));
System.out.println("小於30歲的userList"+userListMap.get(false));
//按照奇數偶數分組進行分組
Map<Object,List<User>> booleanListMap= userList5.stream().collect(Collectors.groupingBy(user1 -> user1.getAge()%2==0));
System.out.print("按照年齡歲數的奇數偶數分組"+booleanListMap);
//啓動多個線程計算
Map<Object,List<User>> booleanListMap2=userList5.stream().parallel().collect(Collectors.groupingBy(user1 -> user1.getAge()%2==0));
System.out.print("按照年齡歲數的奇數偶數分組"+booleanListMap2);
//啓動多個線程計算
userList5.parallelStream().collect(Collectors.groupingBy(user1 -> user1.getAge()%2==0));
//從txt文件中讀取用戶人員的姓名
Files.lines(Paths.get("E://names.txt")).collect(Collectors.toList()).forEach(System.out::println);
//將list列表中找出年齡是奇數的人,並把他的姓名轉化爲大寫
List<String> userList11=userList5.stream().filter(s1->s1.getAge()%2!=0).map(user1->{
return user1.getName().toLowerCase();
}).collect(Collectors.toList());
//假如查詢出來的list<User>取出來的值爲null,避免流造成異常
User user12=userList5.stream().findFirst().orElse(null);
}
public static List<User> createUserList(int count){
List<User> userList=new ArrayList<>();
for(int i=1;i<=count;i++){
User user=new User();
user.setAge(i%100);
user.setUserId(i);
user.setName(i+"name");
userList.add(user);
}
return userList;
}
public static List<User> createUserList(int startAge,int endAge){
List<User> userList=new ArrayList<>();
for(int i=startAge;i<=endAge;i++){
User user=new User();
user.setAge(i);
user.setUserId(i);
user.setName(i+"name");
userList.add(user);
}
return userList;
}
}
User類
import lombok.Data;
@Data
public class User {
private int userId;
private String name;
private int age;
}
Employee 類
import lombok.Data;
@Data
public class Employee {
private int employeeId;
private String userName;
private int salary;
}