1.什么是Stream流之终止操作
(1).简介
执行终止操作会从流的流水线上生成结果,其结果可以是任何不是流的值,例如List、String或者void等。

(2).涉及到的对象定义

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
class Book {
public String title;
public String author;
public Integer pages;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(title, book.title) &&
Objects.equals(author, book.author)
&& Objects.equals(pages,book.pages);
}

@Override
public int hashCode() {
return Objects.hash(title, author, pages);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Author {
public String name;

public String title;
}

2.匹配

public class StreamMatch {
public static void main(String[] args) {
//初始化一个包含5个Book对象的数组,其中有2个重复的元素,并转化为List
List<Book> bookList = Arrays.asList(
new Book("C++编程", "张三", 1216),
new Book("C#编程", "张三", 365),
new Book("Java编程", "李四", 223),
new Book("C++编程", "张三", 1216),
new Book("C#编程", "张三", 365)
);
//使用allMatch()检查是否所有元素匹配已知条件,如果匹配,则返回 true,否则返回 false
boolean b1 = bookList.stream().allMatch(book -> book.getPages() > 300);
if (b1) {//预计输出
System.out.println("列表中所有元素的页码数都大于300");
} else {
System.out.println("列表中有元素的页码数小于等于300");
}

//使用anyMatch()检查是否至少有一个元素匹配已知条件,如果匹配,则返回 true,否则返回 false
boolean b2 = bookList.stream().anyMatch(book -> book.getPages() > 1200);
if (b2) {//预计输出
System.out.println("列表中至少存在一个的元素的页码数大于1200");
} else {
System.out.println("列表中不存在元素页码数大于1200");
}

//使用noneMath()检查是否没元素匹配已知条件的,如果匹配,则返回 true,否则返回 false
boolean b3 = bookList.stream().noneMatch(book -> book.getPages() > 1200);
if (b3) {
System.out.println("列表中不存在元素页码数大于1200");
} else {//预计输出
System.out.println("列表中至少存在一个的元素的页码数大于1200");
}
}
}

3.查找

public class StreamFind {
public static void main(String[] args) {
//初始化一个包含5个Book对象的数组,其中有2个重复的元素,并转化为List
List<Book> bookList = Arrays.asList(
new Book("C++编程", "张三", 1216),
new Book("C#编程", "张三", 365),
new Book("Java编程", "李四", 223),
new Book("C++编程", "张三", 1216),
new Book("C#编程", "张三", 365)
);
//使用findFirst()获取当前流中的第一个元素
Optional<Book> first = bookList.stream().findFirst();
System.out.println("列表中第一个元素为:" + first);

//使用findAny()获取当前流中的任意一个元素
Optional<Book> any = bookList.stream().findAny();
System.out.println("列表中任意一个元素为:" + any);

//使用count()获取当前流中的元素总数
long count = bookList.stream().count();
System.out.println("列表中元素总数为" + count);

//使用max(Comparator c)获取流中最大值
Optional<Book> max = bookList.stream().max(Comparator.comparingInt(Book::getPages));
System.out.println("列表中元素页码最大值为" + max.get().getPages());

//使用min(Comparator c)获取流中最小值
Optional<Book> min = bookList.stream().min(Comparator.comparingInt(Book::getPages));
System.out.println("列表中元素页码最小值为" + min.get().getPages());
}
}

4.收集

@Slf4j
public class StreamCollect {
public static void main(String[] args) {
//创建一个包含7个Integer型的数据,并转为List
List<Integer> integerList = Arrays.asList(10, 12, 9, 8, 20, 1, 10);
//将List流转换为其他Set集合
Set<Integer> collect = integerList.stream().collect(Collectors.toSet());
System.out.println(collect);
}
}