lambda表达式的使用

学习笔记:lambda表达式


一、Lambda基本使用

1、无参数 无返回值

@Test
    public void test1() {
        //原生写法:Runnable接口匿名内部类
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("原生");
            }
        };
        r1.run(); //原生
        //Lambda写法
        Runnable r2 = () -> {
            System.out.println("lambda");
        };
        r2.run();//lambda
    }

2、一个参数 无返回值

 @Test
    public void test2() {
        //原来写法
        Consumer<String> c1 = new Consumer<>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        c1.accept("原来写法");//原来写法
        //lambda
        Consumer<String> c2 = (s) -> {
            System.out.println(s);
        };
        c2.accept("lambda");//lambda
    }

3、类型推断 省略类型

@Test
    public void test4() {

        Consumer<String> c1 = (String s) -> {
            System.out.println(s);
        };
        c1.accept("没有省略数据类型");

        Consumer<String> c2 = (s) -> {
            System.out.println(s);
        };
        c2.accept("省略数据类型");
    }

4、一个参数 省略小括号

@Test
    public void test5() {
        Consumer<String> c = s -> {
            System.out.println(s);
        };
        c.accept("省略小括号");
    }

5、两个或两个以上参数 多条执行语句 可以有返回值

@Test
    public void test6(){
        //原来匿名内部类写法
        Comparator<Integer> c1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(c1.compare(12,34));//第一个参数大于第二个参数则返回1,小于返回-1,相等返回0
        //lambda写法
        Comparator<Integer> c2 = (o1,o2)->{
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(c2.compare(34, 34));
    }

6、一条执行语句 方法体内return和大括号可省略

@Test
    public void test7(){
        Comparator<Integer> c1 = (o1,o2)-> o1.compareTo(o2);
        System.out.println(c1.compare(99, 1));
    }

二、函数式接口

  接口中只有一个抽象方法被称为函数式接口

/**
 * 常见的函数式接口,可通过lambda表达式直接创建该实现对象
 *
 *              接口名             抽象方法
 * 消费型接口:Consumer<T>        void accept(T t)
 * 供给型接口:Supplier<T>        T get()
 * 函数型接口:Function<T,R>      R apply(T t)
 * 断定型接口:Predicate<T>       boolean test(T t)
 */

Consumer:

    @Test
    public void test1() {
        Consumer<Integer> c = x -> System.out.println(x);
        c.accept(100);
    }

Supplier:

    /**
     * @param size 产生size个数
     * @param supplier
     * @return
     */
    public static List addNum(int size, Supplier<Integer> supplier) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < size; i++) { 
            list.add(supplier.get());  //调用get()产生一个随机数,并添加到list集合中
        }
        return list;
    }
    
    @Test
    public void test2() {
        //原来的匿名内部类写法
        List<Integer> list = addNum(5, new Supplier<Integer>() {
            @Override
            public Integer get() {  //调用get()即随机产生一个0到100的整数
//                Math.random()  产生[0,1)之间的随机数
//                Math.random()*100  产生[0,100)之间的随机数
//                (int)Math.random()*100  产生[0,100)之间的随机整数
                return (int) (Math.random() * 100);
            }
        });

        //lambda写法(无参数,方法体只有一句返回值语句,省略了return和大括号)
        List<Integer> list1 = addNum(5, () -> (int) (Math.random() * 100));

        //遍历输出list1
        list1.forEach(t -> System.out.println(t)); //lambda的输出语句
        System.out.println("~~~~~~~~~~~~~~~~~~");
        list1.forEach(System.out::println);  //方法引用输出语句
    }

Function:


    public String handler(String s, Function<String, String> function) {
        return function.apply(s);
    }

    @Test
    public void test3() {
        //原来写法
        String s1 = handler("ABCD", new Function<String, String>() {
            @Override
            public String apply(String s) {
                return s.toLowerCase();
            }
        });
        System.out.println(s1); //abcd
        //lambda写法
        String s2 = handler("abcd", s -> s.toUpperCase());
        System.out.println(s2);//ABCD
    }

Predicate:

    /**
     * @param list      传进来的list集合
     * @param predicate 根据规则过滤掉集合中的整数值
     * @return 返回满足条件的list
     */
    public List<Integer> filterInteger(List<Integer> list, Predicate<Integer> predicate) {
        List<Integer> list1 = new ArrayList<>();
        for (Integer i : list) {
            if (predicate.test(i)) {
                list1.add(i);
            }
        }
        return list1;
    }

    @Test
    public void test4() {
        //原来的写法,声明匿名内部类
        List<Integer> list = Arrays.asList(1, -9, 8, 98, 7, 45, -3);
        List<Integer> list2 = filterInteger(list, new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) {
                return integer > 0; //若大于0则满足条件
            }
        });
        list2.forEach(System.out::println);
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~");

        //lambda写法
        List<Integer> list1 = Arrays.asList(1, -9, 8, 98, 7, 45, -3);
        List<Integer> list3 = filterInteger(list1, integer -> integer > 0);
        list3.forEach(System.out::println);
    }

三、方法引用

/**
 * 方法引用的使用:
 * 		使用格式:类(对象)::方法名
 * 		使用情况:
 * 			1、对象 :: 实例方法   实例方法即非静态方法
 * 			2、类 :: 静态方法
 * 			3、类 :: 实例方法
 * 		使用的要求:接口中的形参列表与返回值类型 和 方法引用的方法的形参列表与返回值类型 得相同(针对于情况1、2)
 */

对象 :: 实例方法

	
	//Consumer中的void accept(T t)
	//PrintStream中的void println(T t)

	@Test
	public void test1() {
		//Lambda表达式使用
		Consumer<String> con1 = str-> System.out.println(str);
		con1.accept("深圳");
		//方法引用的使用
		PrintStream ps = System.out;
		Consumer<String> con2 = ps::println;
		con2.accept("广州");
	}
	
	//Supplier中的T get()
	//Employee中的String getName()
	@Test
	public void test2() {
		Employee employee = new Employee(1001,"jerry",23,15000);
		//Lambda表达式
//		Supplier<String> s1 = () -> employee.getName();
//		System.out.println(s1.get());
		//方法引用的使用
		Supplier<String> s2 = employee::getName;
		System.out.println(s2.get());
	}

类 :: 静态方法

	//Comparator中的int compare(T t1,T t2)
	//Integer中的int compare(T t1,T t2)
	@Test
	public void test3() {
		//Lambda表达式
		Comparator<Integer> com1 = (t1,t2)->Integer.compare(t1,t2);
		System.out.println(com1.compare(14, 66));
		//方法引用的使用
		Comparator<Integer> com2 = Integer::compare; //此处 形参列表和上面一样,可省略了
		System.out.println(com2.compare(66, 44));
	}
	
	//Function中的R apply(T t)
	//Math中的Long round(Double d)
	@Test
	public void test4() {
		//普通写法
		Function<Double,Long> fun = new Function<>() {
			@Override
			public Long apply(Double d) {
				return Math.round(d);
			}
		};
		//Lambda
		Function<Double,Long> fun1 = (d)-> Math.round(d); //return和大括号删掉了
		System.out.println(fun1.apply(12.5));
		//方法引用
		Function<Double,Long> fun2 = Math::round; //形参列表一样,可以省略
		System.out.println(fun2.apply(12.5));
	}

类 :: 实例方法

 
	// Comparator中的int comapre(T t1,T t2)
	// String中的int t1.compareTo(t2)
	@Test
	public void test5() {
		//Lambda
		Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);
		System.out.println(com1.compare("abc","cfd"));
		//方法引用
		Comparator<String> com2 = String::compareTo;
		System.out.println(com2.compare("abc", "cfd"));
	}

	//BiPredicate中的boolean test(T t1, T t2);
	//String中的boolean t1.equals(t2)
	@Test
	public void test6() {
		//Lambda
		BiPredicate<String,String> bp = (s1,s2)->s1.equals(s2);
		System.out.println(bp.test("abc", "abc"));
		//方法引用
		BiPredicate<String,String> bp1 = String::equals;
		System.out.println(bp1.test("bn", "bn"));

	}
	
	// Function中的R apply(T t)
	// Employee中的String getName();
	@Test
	public void test7() {
		//Lambda
		Employee employee = new Employee(1001, "herry", 22, 16000);
		Function<Employee,String> fun1 = e -> e.getName();
		System.out.println(fun1.apply(employee));
		//方法引用
		Function<Employee,String> fun2 = Employee::getName;
		System.out.println(fun2.apply(employee));
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值