Java.util.Stream包中的Stream类是在Java 8中引入的,是Collection Stream()方法提供的流的实现类。Stream()是由java.util.Collection接口实现的ade故障方法。它返回与Collection对象相同类型的Stream实现,它表示集合中元素的顺序流。Collection接口中还有一个名为ParlineStream()的默认方法,它返回一个并行流。
Java.util.Stream.Stream类的Filter方法接受谓词类型的参数,并返回与谓词相同类型的流。谓词是java.util.FunctionPackage中的一个函数接口,它具有测试方法,它计算一个条件并返回一个布尔值。它还提供了一些方法,如AND、或和NERATE,这些方法返回谓词,如a Decorator模式。
以下代码中书店类中的filterByAuthor方法过滤了基于作者的Book对象的集合,forEach方法打印了书的详细信息。
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Stream;
import java.util.function.Predicate;
class Book {
private String publisher;
private String author;
private String name;
private float price;
public Book(String name, String author, float price,
String publisher) {
this.name = name;
this.author = author;
this.price = price;
this.publisher = publisher;
}
/* Getter-Setter methods for each property */
public String getAuthor() {
return author;
}
public String getPublisher() {
return publisher;
}
public String toString() {
return "Title: " + name
+ ", Author: " + author
+ ", Price: " + price
+ ", Publisher: " + publisher;
}
}
class BookStoreFacade {
/**
Filter books by author
*/
public Stream<Book> filterByAuthor(Stream<Book> bookStream,
String author) {
<strong> return bookStream.filter(</strong>
<strong>b -> b.getAuthor().equalsIgnoreCase(author));
</strong>
}
/**Filter books by author and publisher */
public Stream<Book> filterByAuthorAndPublisher(
Stream<Book> bookStream, String author, String publisher) {
<strong> Predicate<Book> testAuthor = b -> b.getAuthor()</strong>
<strong>.equalsIgnoreCase(author);
Predicate<Book> testAuthorAndPublisher = testAuthor
.and(b -> b.getPublisher().equalsIgnoreCase(publisher));
</strong> return bookStream.filter(testAuthorAndPublisher);
}
/**Filter books by author or publisher */
public Stream<Book> filterByAuthorOrPublisher(
Stream<Book> bookStream, String author, String publisher) {
<strong> Predicate<Book> testAuthor = b -> b.getAuthor()</strong>
<strong>.equalsIgnoreCase(author);
Predicate<Book> testAuthorOrPublisher = testAuthor
.or(b -> b.getPublisher().equalsIgnoreCase(publisher));
return bookStream.filter(testAuthorOrPublisher);</strong>
}
}
public class Main {
public static void main(String args[]) {
List<Book> books = new ArrayList<>();
books.add(new Book("You can win", "Shiv Khera", 75,
"Bloomsbury Publishing"));
books.add(new Book("Indian Ethics", "Shyam Ranganathan",
2807,
"Bloomsbury Publishing"));
BookStoreFacade bookstore =new BookStoreFacade();
System.out.println("Books by Shiv Khera: ");
bookstore.filterByAuthor(books.stream(), "Shiv Khera")
.forEach(System.out::println);
System.out.println(
"Books by Shiv Khera and Bloomsbury Publishing: ");
bookstore.filterByAuthorAndPublisher(books.stream(),
"Shiv Khera",
"Bloomsbury Publishing")
.forEach(System.out::println);
System.out.println(
"Books by Shiv Khera or Bloomsbury Publishing: ");
bookstore.filterByAuthorOrPublisher(books.stream(),
"Shiv Khera",
"Bloomsbury Publishing")
.forEach(System.out::println);
}
}
代码1.在流中使用过滤方法