lambda表达式的五种写法& 四大内置函数式接口

本文详细介绍了Lambda表达式的概念、语法及其在Java中的使用,包括匿名内部类的替代、Collections.sort()排序示例、函数式接口的应用,并展示了四大内置函数式接口的实践。
/*
    Lambda表达式
        作用: 简化匿名内部类对象

        使用前提: 函数式接口
        函数式接口: 只有一个必须被重写的抽象方法的接口称为函数式接口
        检查函数式接口注解: @FunctionalInterface 强制检测

        语法:
            () ->  {}
            () :  要重写的抽象方法的参数列表
            -> :  箭头函数 lambda符号 ,具有上下文推到的作用
            {} :  要重写抽象方法的方法体

 */
public class Test01 {
    public static void main(String[] args) {

        String str = "";
        Smoke s =  new Smoke(){
            @Override
            public void behavior(int num) {
                System.out.println("抽烟一共花了" + num + "$");
            }
        };
        s.behavior(20);

        //1.lambda写法1

        Smoke s1 = (int num)->{
            System.out.println("lambda表达式写法1" + num);
        };
        s1.behavior(50);
        //2.lambda写法2 : 当lambda体(重写方法的方法体)中的语句只有一句,前后的{}可以省略
        Smoke s2 = (int num )-> System.out.println("lambda表达式写法二" + num);
        s2.behavior(222);
        ////3.lambda写法3 : 参数的数据类型可以省略
        Smoke s3 = (num) -> System.out.println("lambda表达式写法三" + num);
        s3.behavior(333333333);
        //4.lambda写法4 : 参数只有一个,前后的()可以省略
        Smoke s4 = num -> System.out.println("lambda表达式写法四" + num);
        s4.behavior(444444444);
        //5.lambda写法5 : 当方法存在返回值类型,{}lambda体中只有一条语句,并且是return语句,前后的{}与return关键字可以一起省略
        Moke m = () -> "lambda表达式写法五";
        System.out.println(m.mmm());
        //5.lambda写法5 : 当方法存在返回值类型,{}lambda体中只有一条语句,并且是return语句,前后的{}与return关键字可以一起省略
        Binary b = num -> num<<5;
        System.out.println(b.mmm(10));
    }
}

interface Smoke{
    public void behavior(int num);
}
interface Moke{
    public String mmm();
}
interface Binary{
    public int mmm(int num);
}
题目一
package com.yjxxt.oop.basic.Work04.day03;

import java.util.*;

/*
 * 题一:调用Collections.sort()方法,通过定值排序比较两个Employee(先按年龄比,年龄相同按姓名比),使用Lambda作为参数传递
 * 分析:
 * 	1.定制排序:指自定义比较器|定制排序
 * 	      自然排序:内部比较器|自然排序
 *  2.先比较年龄,年龄相同才比较姓名
 */
public class TestLambda02 {
    public static void main(String[] args) {
        List<Employee> list = new ArrayList<>();
        list.add(new Employee(18,"张三",1101));
        list.add(new Employee(14,"李四",1103));
        list.add(new Employee(19,"王王",1105));
        list.add(new Employee(18,"赵四",1104));
        list.add(new Employee(218,"克棒",1107));
        list.add(new Employee(18,"钱七",1110));
            
            //匿名内部类解法
//        Collections.sort(list, new Comparator<Employee>() {
//            @Override
//            public int compare(Employee o1, Employee o2) {
//                if(o1.getAge()==o2.getAge()){
//                    return o1.getName().compareTo(o2.getName());
//                }
//                return o1.getAge()-o2.getAge();
//            }
//        });
//        System.out.println(list);

        //lambda表达式
        Collections.sort(list,(o1,o2)->{
            if(o1.getAge()==o2.getAge()){
                return o1.getName().compareTo(o2.getName());
            }
            return o1.getAge()-o2.getAge();
        });
        System.out.println(list);

    }
}

class Employee{
    //属性
    private int age;
    private String name;
    private int id;

    public Employee() {
    }

    public Employee(int age, String name, int id) {
        this.age = age;
        this.name = name;
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return age == employee.age &&
                id == employee.id &&
                Objects.equals(name, employee.name);
    }

    @Override
    public String toString() {
        return "Employee{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", id=" + id +
                '}';
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name, id);
    }
}
题目二
package com.yjxxt.oop.basic.Work04.day03;

import java.util.stream.Stream;

/*
 * 习题二:
 * 	1)声明函数式接口,接口中声明抽象方法,public String getValue(String str)
 * 	2)声明类 TestLambda,类中编写方法使用接口作为参数,讲一个字符串转成大写,并作为方法的返回值
 *  3)再将一个字符串的第2个和第4个索引位置进行截取子串
 */
public class TestLambdaTest03 {
    public static void main(String[] args) {
        // 把解决行为当形参,传给方法                                   行为使用了lambda表达式进行简化
        System.out.println(strHandler("yigezifuchaun", str -> str.toUpperCase())); // toUpperCase()  字符串转大写
        System.out.println(strHandler("diergezifuchaun", str -> str.substring(2, 5)));//substring(2, 5)  指定区间字符[)

    }
    public static String strHandler(String str,A a){
        return a.getValue(str);
    }
}
interface A{
    public String getValue(String str);
}


题目三
package com.yjxxt.oop.basic.Work04.day03;

/*
 * 习题三:
 * 	1)声明一个带两个泛型的函数式接口,泛型类型为<T,R> T为参数,R为返回值
 * 	2)接口中声明对应抽象方法
 *  3)在TestLambda类中声明方法,参数三个,两个long类型的参数,接口作为参数,接口实现中计算两个long型参数的和
 *  4)再计算两个long型参数的乘积
 */
public class LambdaTest04 {
    public static void main(String[] args) {
        // 把解决行为当形参,传给方法
        System.out.println(testLong(100L, 150L, (l1, l2) -> l1 + l2));  //计算两个long的和
        System.out.println(testLong(100L, 150L, (l1, l2) -> l1 * l2));  //计算两个long的乘机


    }
    public static Long testLong(Long l1 , Long l2,B<Long,Long> b){
        return b.test(l1,l2);
    }
}
interface B<X,Y>{
    Y test(X x,X x1);
}

四大内置函数式接口
package com.yjxxt.oop.basic.Work04.day03;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/*
    四大内置函数式接口  必须掌握***
        消费型接口 Consumer<T>
            void accept(T t)  有一个参数没有返回值

        函数型接口 Function<T,R>
            R apply(T t)    有一个参数一个返回值

        段言型接口 Predicate<T>
            boolean test(T t)   一个参数一个boolean返回值

        供给型接口 Supplier<T>
            T get()             没有参数一个返回值
 */
public class Test05 {
    public static void main(String[] args) {
        // 消费型接口 Consumer<T>
        testConsumer(150D,d-> System.out.println("今天出去消费类了 " + d +"$"));
        // 函数型接口 Function<T,R>
        System.out.println(testFunction(88, num -> num << 5));   // <<
        //段言型接口 Predicate<T>
        System.out.println(testPredicate(List.of("dwadaw", "dsa", "dgw", "w", "rafgd", "s"), str -> str.length() > 3));
        //供给型接口 Supplier<T>
        System.out.println(testSupplier(5, () -> (int) (Math.random()* (50 - 10) + 10)));


    }

    //消费型
    // 消费型接口 Consumer<T>
    //            void accept(T t)  有一个参数没有返回值
    public static void testConsumer(Double d1, Consumer<Double> dd){
        dd.accept(d1);
    }

    // 函数型接口 Function<T,R>
    //            R apply(T t)    有一个参数一个返回值
    public static int testFunction(int num, Function<Integer,Integer> fct){
         return fct.apply(num);
    }

   // 段言型接口 Predicate<T>
    //boolean test(T t)   一个参数一个boolean返回值
    public static List<String> testPredicate(List<String> str, Predicate<String> prd){
        List<String> li = new ArrayList<>();
        for (String s:str){
            if(prd.test(s)){
                li.add(s);
            }
        }
         return li;
    }

    // 供给型接口 Supplier<T>
    //            T get()             没有参数一个返回值
    public static List testSupplier(int num , Supplier<Integer> supplier){
        List<Integer> list = new ArrayList<>();
        for (int i = 1;i<=num;i++){
             list.add(supplier.get());
        }
        return list;
    }

}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值