Java 8新特性-3 Lambda 表达式

在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差。

在Java 8 之前使用匿名内部类

  • 例如
    interface ITestPrint{
        public  void print();
    }
    
    
    public class TestLambda {
    
        public static void fun(ITestPrint testPrint){
            testPrint.print();
        }
    
        public static void main(String[] args) {
            fun(new ITestPrint() {
                @Override
                public void print() {
                    System.out.println("普通的匿名内部类方法调用!");
                }
            });
        }
    }

  可以看出我们只需打印一句话就多了特别多的冗余代码,所以在Java 8 引入了 函数式编程

Lambda 表达式的应用则使代码变得更加紧凑,可读性增强。

Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码。

  • 范例使用 Lambda  表达式
  • //修改为Lambda表达式 
    fun(()-> System.out.println("使用 Lambda 表达式,一句话搞定!"));

    Lambda 表达式由三个部分组成:

    • 第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;

    • 第二部分为一个箭头符号:->;

    • 第三部分为方法体,可以是表达式和代码块。

   Lambda 语法的三种形式

    • (参数)->单行语句;
    • (参数)->{单行或多行语句};
    • (参数)->表达式;
  • 例如:
    interface ITestPrint{
        public  void printStr(String str);
    }
    
    interface ITestAdd{
        public  int add(int numa,int numb);
    }
    
    public class TestLambda {
    
        public static void funPrint(ITestPrint testPrint){
            testPrint.printStr("带参数语句");
        }
    
        public  static void funAdd(ITestAdd testAdd){
            System.out.println(testAdd.add(10,20));
        }
    
        public static void main(String[] args) {
           
            //参数 -> 单行语句
            funPrint((str)-> System.out.println(str));
    
            //参数 -> 多行语句
            funPrint((str) -> {
                str.toUpperCase();
                System.out.println(str);
            });
    
            //表达式形式
            funAdd(((numA, numB) -> numA + numB));
    
        }
    }

     

要使用 Lambda 表达式,需要定义一个函数式接口,这样往往会让程序充斥着过量的仅为 Lambda 表达式服务的函数式接口。

为了减少这样过量的函数式接口,Java 8 在 java.util.function 中增加了不少新的函数式通用接口

例如:

  • Function<T, R>:将 T 作为输入,返回 R 作为输出,他还包含了和其他函数组合的默认方法。
  • Predicate<T> :将 T 作为输入,返回一个布尔值作为输出,该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(与、或、非)。
  • Consumer<T> :将 T 作为输入,不返回任何内容,表示在单个参数上的操作。
interface PersonInterface {
    public boolean test(Person person);
}

public class People {
    private List<Person> persons= new ArrayList<Person>();
    public List<Person> getMaleList(PersonInterface filter) {
        List<Person> res = new ArrayList<Person>();
        persons.forEach(
                (Person person) ->
                {
                    if (filter.test(person)) {//调用 PersonInterface 的方法
                        res.add(person);
                    }
                }
        );
        return res;
    }
}

//为了去除 PersonInterface 这个函数式接口,可以用通用函数式接口 Predicate 替代如下:
class People{
    private List<Person> persons= new ArrayList<Person>();
    public List<Person> getMaleList(Predicate<Person> predicate) {
        List<Person> res = new ArrayList<Person>();
        persons.forEach(
                person -> {
                    if (predicate.test(person)) {//调用 Predicate 的抽象方法 test
                        res.add(person);
                    }
                });
        return res;
    }
}

 

转载于:https://www.cnblogs.com/MPPC/p/5354292.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值