前言
Stream 翻译称为 “流”,是 Java8 的新特性之一。 Stream 将要处理的元素看作是流,这时可以借助 Stream API 对流中的元素进行中间操作,比如:筛选、排序、排序等。
中间过程
/**
* 过滤
*/
log.warning("过滤");
projectList.stream().filter(a->a.getProjectCount()!=null).forEach(System.out::println);
/**
* 取前几
*/
log.info("取前几");
long count = listMap.stream().limit(2).count();
System.out.println("名次--->"+count);
/**
* 跳过n元素,配合limit(n)可实现分页
*/
log.info("跳过n元素,配合limit(n)可实现分页");
projectList.stream().skip(2).limit(1).forEach(System.out::println);
/**
* 去重
*/
log.info("去重");
projectList.stream().distinct().forEach(System.out::println);
/**
* 排序
*/
log.info("排序--正序");
projectList.stream().filter(a->a.getProjectCount()!=null)
.sorted(Comparator.comparing(Project::getProjectCount)).collect(Collectors.toList()).forEach(System.out::println);
log.info("排序--倒序");
projectList.stream().filter(a->a.getProjectCount()!=null)
.sorted(Comparator.comparing(Project::getProjectCount).reversed()).collect(Collectors.toList()).forEach(System.out::println);
结果集
/**
* map映射--list对象某个属性转list
*/
log.info("map映射--list对象某个属性转list");
projectList.stream().map(a->a.getProjectName()).collect(Collectors.toList()).forEach(System.out::println);
/**
*
* map映射--list对象某个属性转<Map>
*
*/
log.info("map映射--list对象某个属性转List<Map>");
Map<String, BigDecimal> collect = projectList.stream().filter(a->a.getProjectCount()!=null).collect(Collectors.toMap(Project::getProjectName, Project::getProjectCount,(k1,k2)->k1));
System.out.println(collect);
/**
* 都符合为true,断言
*/
boolean b = projectList.stream().allMatch(a ->a.getProjectCount()!=null);
System.out.println(b);
/**
* 都不符合为true,断言
*/
boolean b1 = projectList.stream().noneMatch(a -> a.getProjectName().equals("条约"));
System.out.println(b1);
/**
* 只要有一个就为true,断言
*/
boolean b2 = projectList.stream().anyMatch(a -> a.getProjectCount() == null);
System.out.println(b2);
/**
* 返回list中第一名
*/
Project project = projectList.stream().findFirst().get();
System.out.println("第一个屈辱条约->"+project);
/**
* 返回list中最大值
*/
Project project1 = projectList.stream().filter(a->a.getProjectCount()!=null).max(Comparator.comparing(Project::getProjectCount)).get();
System.out.println("赔款最多的条约->"+project1);
/**
* 返回list中最小值
*/
Project project2 = projectList.stream().filter(a->a.getProjectCount()!=null).min(Comparator.comparing(Project::getProjectCount)).get();
System.out.println("赔款最少的条约->"+project2);
/**
* list分组
*/
Map<String, List<Project>> collect1 = projectList.stream().collect(Collectors.groupingBy(Project::getProjectName));
System.out.println(collect1);
/**
* 字符串分隔符连接
*/
String collect2 = projectList.stream().distinct().map(Project::getProjectName).collect(Collectors.joining(",", "(", ")"));
System.out.println(collect2);
/**
* list 中某属性求和
*/
Double collect3 = projectList.stream().filter(a -> a.getProjectCount() != null).collect(Collectors.summingDouble(Project::getProjectId));
System.out.println(collect3);
double sum = projectList.stream().filter(a -> a.getProjectCount() != null).mapToDouble(Project::getProjectId).sum();
System.out.println(sum);
BigDecimal reduce = projectList.stream().filter(a -> a.getProjectCount() != null).map(Project::getProjectCount).reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println(reduce);
/**
* list 中某属性求平均值
*/
Double collect4 = projectList.stream().filter(a -> a.getProjectCount() != null).collect(Collectors.averagingDouble(Project::getProjectId));
System.out.println(collect4);
/**
* 数据集合
*/
DoubleSummaryStatistics collect5 = projectList.stream().filter(a -> a.getProjectCount() != null).collect(Collectors.summarizingDouble(Project::getProjectId));
System.out.println(collect5.getMax());
System.out.println(collect5.getAverage());
System.out.println(collect5.getCount());
/**
* 分区
*/
Map<Boolean, List<Project>> collect6 = projectList.stream().collect(Collectors.partitioningBy(a -> a.getProjectCount() != null));
System.out.println(collect6);
/**
* 排序
*/
-- desc
dtoList.sort(Comparator.comparing(EnterprisePropertyDto::getRemovalRate,Comparator.nullsLast(Comparator.reverseOrder())));
-- asc
dtoList.sort(Comparator.comparing(EnterprisePropertyDto::getDealNum,Comparator.nullsLast(Comparator.naturalOrder())));
测试类
package test;
import java.math.BigDecimal;
import java.util.*;
import java.util.logging.Logger;
import java.util.stream.Collectors;
/**
* JDK 1.8 流操作
* @author Abner G
* @date 2022/3/6 20:05
*/
public class StreamTest {
private static String name = StreamTest.class.getName();
private static Logger log = Logger.getLogger(name);
private static final List<Map<String,Object>> listMap=new ArrayList<>();
private static final List<Project> projectList=new ArrayList<>();
static {
Map<String, Object> map1 = new HashMap<>();
Map<String, Object> map2 = new HashMap<>();
Map<String, Object> map3 = new HashMap<>();
map1.put("abner","博客");
map2.put("java","计算机语言");
map3.put("Clickhouse","数据库");
listMap.add(map1);
listMap.add(map2);
listMap.add(map3);
Project project1 = new Project(1, "南京条约", new BigDecimal("10000"));
Project project2 = new Project(2, "马关条约", new BigDecimal("30000"));
Project project3 = new Project(3, "辛丑条约", null);
Project project4 = new Project(2, "天津条约", new BigDecimal("20000"));
projectList.add(project1);
projectList.add(project2);
projectList.add(project3);
projectList.add(project4);
projectList.add(project4);
}
public static void main(String[] args) {
/**
* 过滤
*/
log.warning("过滤");
projectList.stream().filter(a->a.getProjectCount()!=null).forEach(System.out::println);
/**
* 取前几
*/
log.info("取前几");
long count = listMap.stream().limit(2).count();
System.out.println("名次--->"+count);
/**
* 跳过n元素,配合limit(n)可实现分页
*/
log.info("跳过n元素,配合limit(n)可实现分页");
projectList.stream().skip(2).limit(1).forEach(System.out::println);
/**
* 去重
*/
log.info("去重");
projectList.stream().distinct().forEach(System.out::println);
/**
* 排序
*/
log.info("排序--正序");
projectList.stream().filter(a->a.getProjectCount()!=null)
.sorted(Comparator.comparing(Project::getProjectCount)).collect(Collectors.toList()).forEach(System.out::println);
log.info("排序--倒序");
projectList.stream().filter(a->a.getProjectCount()!=null)
.sorted(Comparator.comparing(Project::getProjectCount).reversed()).collect(Collectors.toList()).forEach(System.out::println);
/**
* map映射--list对象某个属性转list
*/
log.info("map映射--list对象某个属性转list");
projectList.stream().map(a->a.getProjectName()).collect(Collectors.toList()).forEach(System.out::println);
/**
*
* map映射--list对象某个属性转<Map>
*
*/
log.info("map映射--list对象某个属性转List<Map>");
Map<String, BigDecimal> collect = projectList.stream().filter(a->a.getProjectCount()!=null).collect(Collectors.toMap(Project::getProjectName, Project::getProjectCount,(k1,k2)->k1));
System.out.println(collect);
/**
* 都符合为true,断言
*/
boolean b = projectList.stream().allMatch(a ->a.getProjectCount()!=null);
System.out.println(b);
/**
* 都不符合为true,断言
*/
boolean b1 = projectList.stream().noneMatch(a -> a.getProjectName().equals("条约"));
System.out.println(b1);
/**
* 只要有一个就为true,断言
*/
boolean b2 = projectList.stream().anyMatch(a -> a.getProjectCount() == null);
System.out.println(b2);
/**
* 返回list中第一名
*/
Project project = projectList.stream().findFirst().get();
System.out.println("第一个屈辱条约->"+project);
/**
* 返回list中最大值
*/
Project project1 = projectList.stream().filter(a->a.getProjectCount()!=null).max(Comparator.comparing(Project::getProjectCount)).get();
System.out.println("赔款最多的条约->"+project1);
/**
* 返回list中最小值
*/
Project project2 = projectList.stream().filter(a->a.getProjectCount()!=null).min(Comparator.comparing(Project::getProjectCount)).get();
System.out.println("赔款最少的条约->"+project2);
/**
* list分组
*/
Map<String, List<Project>> collect1 = projectList.stream().collect(Collectors.groupingBy(Project::getProjectName));
System.out.println(collect1);
/**
* 字符串分隔符连接
*/
String collect2 = projectList.stream().distinct().map(Project::getProjectName).collect(Collectors.joining(",", "(", ")"));
System.out.println(collect2);
/**
* list 中某属性求和
*/
Double collect3 = projectList.stream().filter(a -> a.getProjectCount() != null).collect(Collectors.summingDouble(Project::getProjectId));
System.out.println(collect3);
double sum = projectList.stream().filter(a -> a.getProjectCount() != null).mapToDouble(Project::getProjectId).sum();
System.out.println(sum);
BigDecimal reduce = projectList.stream().filter(a -> a.getProjectCount() != null).map(Project::getProjectCount).reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println(reduce);
/**
* list 中某属性求平均值
*/
Double collect4 = projectList.stream().filter(a -> a.getProjectCount() != null).collect(Collectors.averagingDouble(Project::getProjectId));
System.out.println(collect4);
/**
* 数据集合
*/
DoubleSummaryStatistics collect5 = projectList.stream().filter(a -> a.getProjectCount() != null).collect(Collectors.summarizingDouble(Project::getProjectId));
System.out.println(collect5.getMax());
System.out.println(collect5.getAverage());
System.out.println(collect5.getCount());
/**
* 分区
*/
Map<Boolean, List<Project>> collect6 = projectList.stream().collect(Collectors.partitioningBy(a -> a.getProjectCount() != null));
System.out.println(collect6);
}
}
class Project{
private Integer projectId;
private String projectName;
private BigDecimal projectCount;
public Project(Integer projectId, String projectName, BigDecimal projectCount) {
this.projectId = projectId;
this.projectName = projectName;
this.projectCount = projectCount;
}
public Integer getProjectId() {
return projectId;
}
public void setProjectId(Integer projectId) {
this.projectId = projectId;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public BigDecimal getProjectCount() {
return projectCount;
}
public void setProjectCount(BigDecimal projectCount) {
this.projectCount = projectCount;
}
@Override
public String toString() {
return "Project{" +
"projectId=" + projectId +
", projectName='" + projectName + '\'' +
", projectCount=" + projectCount +
'}';
}
}