Java 集合系列(6): Predicate接口源码 && Consumer接口源码

标签:  Predicate 匿名内部类 lambda表达式
16人阅读 评论(0) 收藏 举报
分类:
package java.util.function;

import java.util.Objects;

/**
 * Predicate功能判断输入的对象是否符合某个条件
 * @since 1.8
 */

@FunctionalInterface
public interface Predicate<T> {      //Predicate函数编程

    
    boolean test(T t);

    
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

   
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

lambda表达式


从上面代码可以发现,Java 8新增了接口的默认(default)方法和(static)静态方法。在Java 8以前,接口里的方法要求全部是抽象方法。但是静态(static)方法只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用;默认(default)方法只能通过接口实现类的对象来调用。

接下来主要来使用接口方法test,可以使用匿名内部类提供test()方法的实现,也可以使用lambda表达式实现test()。 
体验一下Predicate的函数式编程,使用lambda实现。其测试代码如下:


package com.fengxiyuma.kuanjia;

public class Java8Tester {
    public static void main(String[] args) {
    	
    	 //-----------------------------------------------------------------------
        java.util.function.Predicate<Integer> boolValue = x -> x > 5;
        System.out.println(boolValue.test(1));//false
        System.out.println(boolValue.test(6));//true
        //-----------------------------------------------------------------------
    	
    	
    	
    	Java8Tester tester = new Java8Tester();
        
        // 类型声明
        MathOperation addition = (int a, int b) -> a + b;
          
        // 不用类型声明
        MathOperation subtraction = (a, b) -> a - b;
          
        // 大括号中的返回语句
        MathOperation multiplication = (int a, int b) -> { return a * b; };
          
        // 没有大括号及返回语句
        MathOperation division = (int a, int b) -> a / b;
          
        System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
        System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
        System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
        System.out.println("10 / 5 = " + tester.operate(10, 5, division));
          
        // 不用括号
        GreetingService greetService1 = message ->
        System.out.println("Hello " + message);
          
        // 用括号
        GreetingService greetService2 = (message) ->
        System.out.println("Hello " + message);
          
        greetService1.sayMessage("Runoob");
        greetService2.sayMessage("Google");
     }
      
     interface MathOperation {
        int operation(int a, int b);
     }
      
     interface GreetingService {
        void sayMessage(String message);
     }
      
     private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
     }
}

结果:

false
true
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Runoob
Hello Google

Consumer接口源码

/** 
 * 代表一个操作,这个操作接受单一输入参数并且不返回任何结果。不像其它大多数函数接口,Consumer被 
 * 期望通过副作用操作。(通过副作用操作时什么意思?) 
 * 
 *这是一个函数接口,它函数方法是accept(Object)。 
 */  
@FunctionalInterface  
public interface Consumer<T> {  
  
    /** 
     * 对给定参数执行这个操作 
     */  
    void accept(T t);  
  
    /** 
     * 返回一个组合的Consumer,它依次执行这个操作和after操作。如果任何一个操作抛出异常,异常 
     * 会被传递给组合操作的调用者。如果执行这个操作抛出异常,after操作将不会被执行。 
     */  
    default Consumer<T> andThen(Consumer<? super T> after) {  
        Objects.requireNonNull(after);  
        return (T t) -> { accept(t); after.accept(t); };  
    }  
}  

从上面代码可以看出,Consumer使用了Java 8接口新特性——接口默认(default)方法。接下来使用接口方法accept,体验一下Consumer函数编程。其测试代码如下:(还要想想,直接贴其他人的代码了)

@Test
public void testConsumer(){
    User user = new User("zm");
    //接受一个参数
    Consumer<User> userConsumer = User1 -> User1.setName("zmChange");
    userConsumer.accept(user);
    System.out.println(user.getName());//zmChange
}

在Java 8之前的实现如下:

@Test
public void test(){
    User user = new User("zm");
    this.change(user);
    System.out.println(user.getName());//输出zmChange
}

private void change(User user){
    user.setName("zmChange");
}




参考:http://www.runoob.com/java/java8-lambda-expressions.html

          https://blog.csdn.net/anonymousprogrammer/article/details/76034393

          https://blog.csdn.net/chuji2012/article/details/77871011

          https://blog.csdn.net/l294265421/article/details/45131731



查看评论

Java 8 - Predicate和Consumer接口函数式编程

Predicate函数编程 Consumer函数编程 Predicate功能判断输入的对象是否符合某个条件。官方文档解释到:Determines if the input object matches...
  • chuji2012
  • chuji2012
  • 2017-09-06 20:27:44
  • 957

Java JVM(七):Function,Consumer,Predicate 接口

包括 Funciton,Consumer,Predicate 接口的使用。
  • u014077165
  • u014077165
  • 2015-09-09 12:07:18
  • 7737

Java8 Consumer接口源码阅读

/** * 代表一个操作,这个操作接受单一输入参数并且不返回任何结果。不像其它大多数函数接口,Consumer被 * 期望通过副作用操作。(通过副作用操作时什么意思?) * *这是一个函数接口...
  • l294265421
  • l294265421
  • 2015-04-19 19:33:29
  • 2708

[疯狂Java]集合:Collection的迭代器Iterator、使用Predicate筛选集合中的元素

1. Iterator——迭代器:     1) 和C++中迭代器的概念一样,二要素:          i. 迭代器必定从属于某个容器,其作用就是用来遍历所属容器中的元素的!         ...
  • Lirx_Tech
  • Lirx_Tech
  • 2016-05-23 21:36:02
  • 4366

JDK8新特性☞接口Supplier||Consumer||Compator测试

/**  * JDK8新特性☞Supplier接口测试:该接口返回一个任意泛型的值,和Function接口不同的是该接口没有任何参数  * Consumer接口:表示执行在单个参数上的操作 Com...
  • braincer
  • braincer
  • 2017-06-21 14:57:46
  • 1191

Java 8 中函数接口分析

C/C++中有函数指针,javascript 中函数可以作为变量使用。在java 8之前,java的回调更多的是使用对象的形式完成。java 8 之后,可以使用函数接口来接受lambda表达式,甚至可...
  • chenshijue
  • chenshijue
  • 2016-11-14 11:14:44
  • 1297

【java】【java8】Lambda、Stream、Function、Consumer、Predicate、Supplier

Function源代码 package java.util.function; import java.util.Objects; /** * Represents a function tha...
  • lzm18064126848
  • lzm18064126848
  • 2017-04-16 23:58:52
  • 2651

和Lambda表达式相关的Consumer、Function、Predicate 与 Supplier

http://openhome.cc/Gossip/Java/ConsumerFunctionPredicateSupplier.html Lambda表示式實際的型態要看函式介面,雖然可以自行...
  • hotdust
  • hotdust
  • 2016-11-07 16:39:15
  • 475

dubbo源码分析-consumer端1-consumer代理生成

主要介绍dubbo的consumer代理类生成流程
  • youaremoon
  • youaremoon
  • 2016-02-24 14:56:47
  • 4235
    个人资料
    持之以恒
    等级:
    访问量: 7202
    积分: 780
    排名: 6万+
    轻松一下
    文章存档
    最新评论