/**
* min():取流中最小值
*/
@Test
void test1(){
List<Integer> list = List.of(1,4,2,8,5);
Integer num = list.stream().min((o1, o2) -> o1.compareTo(o2)).get();
System.out.println(num); //1
}
二、max()
/**
* max():取流中的最大值
*/
@Test
void test2(){
System.out.println(list.stream().max((o1, o2) -> o1.compareTo(o2)).get());
//8
}
三、findFirst()
/**
* FindFirst():取流中的第一个值
*/
@Test
void test3(){
List<Integer> list = Arrays.asList(1, 4, 2, 8, 5);
//获取串行流
Integer num1 = list.stream().findFirst().get();
System.out.println(num1); // 1
//获取并行流
Integer num2 = list.parallelStream().findFirst().get();
System.out.println(num2); // 1
}
四、findAny()
/**
* FindAny():获取流中任何一个数
*
* 在并行流中,findany()返回的是处理的最快的线程的数据,并行流适用于对于顺序没有严格要求的操作
*/
@Test
void test4() {
List<Integer> list = Arrays.asList(1, 4, 2, 8, 5);
//获取串行流
Integer num1 = list.stream().findAny().get();
System.out.println(num1); // 1
//获取并行流
Integer num2 = list.parallelStream().findAny().get();
System.out.println(num2); // 2
}
五、map()
@Data
@AllArgsConstructor
@NoArgsConstructor
static class User {
private String name;
private Integer age;
}
/**
* map():调用此方法可以改变返回的类型
*/
@Test
void test5() {
/**
* 将asList中的数据由字符串修改为int
*/
List<String> asList = Arrays.asList("1", "2", "5", "4");
asList.stream().map(str -> Integer.parseInt(str)).forEach(str -> {
System.out.println(str);
System.out.println(str.getClass());
});
/**
* 将list中的对象的中name打印出来
*/
List<User> list = List.of(new User("张三", 13), new User("李四", 36), new User("王五", 12));
list.stream().map(user -> user.getName()).forEach(name -> {
System.out.println(name);
});
}
六、filter()
/**
* filter():对流进行过滤
*/
@Test
void tst6() {
/**
* 将年龄大于等于13的用户的名字打印出来
*/
List<User> list = List.of(new User("张三", 13), new User("李四", 36), new User("王五", 12));
list.stream().filter(user -> user.getAge() >= 13).forEach(user -> {
System.out.println(user.getName());//张三、李四
});
}
七、flatMap()
/**
* flatMap():把两个流改变为一个流
*/
@Test
void tst7() {
List<String> stringList = new ArrayList<>();
stringList.add("aa");
stringList.add("bb");
stringList.add("cc");
stringList.stream().map(str -> str.split("")).flatMap(st -> Arrays.stream(st)).forEach(System.out::print);
//aabbcc
}
八、anyMatch()
/**
* anyMatch():判断条件中,任意一个匹配,则返回true
*/
@Test
void tst() {
List<String> a = List.of("a", "a", "a");
List<String> b = List.of("a", "a", "a","b");
boolean mark1 = a.stream().anyMatch(o -> o.equals("a"));
System.out.println(mark1); //true
boolean mark2= b.stream().anyMatch(o -> o.equals("a"));
System.out.println(mark2); //true
}
九、allMatch()
/**
* allMatch():判断条件中,所有元素匹配才返回true
*/
@Test
void tst9() {
List<String> a = List.of("a", "a", "a");
List<String> b = List.of("a", "a", "a", "b");
boolean mark1 = a.stream().allMatch(o -> o.equals("a"));
boolean mark2 = b.stream().allMatch(o -> o.equals("a"));
System.out.println("mark1:" + mark1 + "----mark2:" + mark2);//mark1:true----mark2:false
}
十、nonMatch()
/**
* nonMatch():判断条件都不满足,则返回true
*/
@Test
void tst10(){
List<String> b = List.of("a", "a", "a", "b");
boolean mark = b.stream().noneMatch(o -> o.equals("c"));
System.out.println(mark);//true
}
十一、sorted()
/**
* sorted():排序
*/
@Test
void tst11() {
List<User> users = new ArrayList<>();
users.add(new User("张三", 12));
users.add(new User("李四", 15));
users.add(new User("王五", 13));
//升序:
Stream<User> sorted1 = users.stream().sorted(Comparator.comparingInt(User::getAge));
sorted1.forEach(System.out::println);
System.out.println("-------------");
//降序:
Stream<User> sorted2 = users.stream().sorted(Comparator.comparingInt(User::getAge).reversed());
sorted2.forEach(System.out::println);
}
十二、peek()
/**
* peek():对对象的属性进行操作
*/
@Test
void tst12() {
List<User> users = new ArrayList<>();
users.add(new User("张三", 12));
users.add(new User("李四", 15));
users.add(new User("王五", 13));
//对年龄大于12的用户在原基础上年龄再加5
List<User> userList = users.stream().filter(o -> o.getAge() > 12).peek(user -> {
user.setAge(user.getAge() + 5);
}).collect(Collectors.toList());
System.out.println(userList);
//[DemoApplicationTests.User(name=李四, age=20), DemoApplicationTests.User(name=王五, age=18)]
}
十三、limit()、skip()
/**
* limit():截取,skip():跳过
*/
@Test
void tst13(){
//从1开始自增无线迭代,跳过前5个数,截取10个数
Stream.iterate(1,x->++x).skip(5).limit(10).forEach(System.out::print);
}
//6789101112131415
十四、reduce()
/**
* reduce():Stream的一个聚合方法,它可以把一个Stream的所有元素按照聚合函数聚合成一个结果。
*/
@Test
void tst14(){
List<Integer> list = Stream.iterate(1, x -> ++x).limit(10).collect(Collectors.toList());
//计算list里面的元素的总和
Integer reduce = list.stream().reduce(0, (a, b) -> a + b);
System.out.println(reduce);
//传统计算list元素总和方法
int a=0;
for (Integer integer : list) {
a += integer;
}
System.out.println(a);
}