You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

172 lines
5.0 KiB

package com.example.demo.service;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class TestMain {
//工作中常用的一些Stream流操作,多年实践总结
/**
* 演示map的用途:一对一转换
*/
@Test
public void stringToIntMap() {
List<String> ids = Arrays.asList("205", "105", "308", "469", "627", "193", "111");
// 使用流操作
List<User> results = ids.stream()
.map(id -> {
User user = new User(Integer.valueOf(id));
return user;
})
.collect(Collectors.toList());
System.out.println(results);
}
/**
* 演示map的用途:一对多转换
*/
@Test
public void stringToIntFlatmap() {
List<String> sentences = Arrays.asList("hello world", "Jia Gou Wu Dao");
// 使用流操作
List<String> results = sentences.stream()
.flatMap(sentence -> Arrays.stream(sentence.split(" ")))
.collect(Collectors.toList());
System.out.println(results);
}
/**
*filter、sorted、distinct、limit
*/
@Test
public void testGetTargetUsers() {
List<String> ids = Arrays.asList("205", "10", "308", "49", "627", "193", "111", "193");
// 使用流操作
List<User> results = ids.stream()
.filter(s -> s.length() > 2)
.distinct()
.map(Integer::valueOf)
.sorted(Comparator.comparingInt(o -> o))
.limit(3)
.map(id -> new User(id))
.collect(Collectors.toList());
System.out.println(results);
}
/**
* 简单结果终止方法
*/
@Test
public void testSimpleStopOptions() {
List<String> ids = Arrays.asList("205", "10", "308", "49", "627", "193", "111", "193");
// 统计stream操作后剩余的元素个数
System.out.println(ids.stream().filter(s -> s.length() > 2).count());
// 判断是否有元素值等于205
System.out.println(ids.stream().filter(s -> s.length() > 2).anyMatch("205"::equals));
// findFirst操作
ids.stream().filter(s -> s.length() > 2)
.findFirst()
.ifPresent(s -> System.out.println("findFirst:" + s));
}
/**
* 一旦一个Stream被执行了终止操作之后,后续便不可以再读这个流执行其他的操作了,否则会报错
*/
@Test
public void testHandleStreamAfterClosed() {
List<String> ids = Arrays.asList("205", "10", "308", "49", "627", "193", "111", "193");
Stream<String> stream = ids.stream().filter(s -> s.length() > 2);
// 统计stream操作后剩余的元素个数
System.out.println(stream.count());
System.out.println("-----下面会报错-----");
// 判断是否有元素值等于205
try {
System.out.println(stream.anyMatch("205"::equals));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("-----上面会报错-----");
}
/**
* 生成集合
*/
@Test
public void testCollectStopOptions() {
List<User> ids = Arrays.asList(new User(17), new User(22), new User(23));
// collect成list
List<User> collectList = ids.stream().filter(dept -> dept.getId() > 20)
.collect(Collectors.toList());
System.out.println("collectList:" + collectList);
// collect成Set
Set<User> collectSet = ids.stream().filter(dept -> dept.getId() > 20)
.collect(Collectors.toSet());
System.out.println("collectSet:" + collectSet);
// collect成HashMap,key为id,value为Dept对象
Map<Integer, User> collectMap = ids.stream().filter(dept -> dept.getId() > 20)
.collect(Collectors.toMap(User::getId, dept -> dept));
System.out.println("collectMap:" + collectMap);
}
/**
* 生成拼接字符串
*/
@Test
public void testCollectJoinStrings() {
List<String> ids = Arrays.asList("205", "10", "308", "49", "627", "193", "111", "193");
String joinResult = ids.stream().collect(Collectors.joining(","));
System.out.println("拼接后:" + joinResult);
}
/**
* 数学运算
*/
@Test
public void testNumberCalculate() {
List<Integer> ids = Arrays.asList(10, 20, 30, 40, 50);
// 计算平均值
Double average = ids.stream().collect(Collectors.averagingInt(value -> value));
System.out.println("平均值:" + average);
// 数据统计信息
IntSummaryStatistics summary = ids.stream().collect(Collectors.summarizingInt(value -> value));
System.out.println("数据统计信息: " + summary);
}
}
@Data
@AllArgsConstructor
class User {
private int id;
}