Java流中的过滤方法

210 阅读1分钟

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.在流中使用过滤方法