Java - 函数式编程,Lambda 表达式

Lambda 表达式


	public void expr1() {
		/*
		 * 在最简单的形式中,一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示
		 */
		Arrays.asList("a", "b", "c").forEach(e -> System.out.println(e));
		Arrays.asList(1, 2, 3).forEach((Integer e) -> {
			e *= 2;
			System.out.println(e);
		});
	}


Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口


Comparator 接口 - 函数式排序


	public void expr2() {
		/*
		 * 1. Lambda可能会返回一个值
		 * 2. 返回值的类型也是由编译器推测出来的
		 * 3. 如果lambda的函数体只有一行的话,那么没有必要显式使用return语句
		 */
		List<Integer> list = Arrays.asList(5, 7, 2, 3); 
		//Lambda表达式“(x, y) -> y - x”实现了java.util.Comparator接口
//		list.sort((e1, e2) -> e1.compareTo(e2)); // 升序
		list.sort((e1, e2) -> e2.compareTo(e1)); // 降序
		System.out.println(list);
	}


Runnable 接口


import org.junit.Test;

public class ThreadUseLambda {
	/*
	 * 对于函数式接口:
	 * 除了可以使用Java中标准的方法来创建实现对象之外,还可以使用lambda表达式来创建实现对象
	 * 比如:
	 * Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口
	 */
	public void sum(int a, int b) {
		System.out.println(a+b);
	}
	@Test
	public void runThreadUseLambda() {
		// 线程1
	    new Thread(() -> {
	        sum(1, 3);
	    }).start();
	    // 线程2
	    new Thread(() -> {
	    	sum(2, 4);
	    }).start();
	}
}


函数式接口Function


Java SE 8增加了 java.util.function 包,里面都是可以在开发中使用的函数式接口。开发人员也可以创建新的函数式接口。


package redis.practice;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;

public class CollectionUtils {
	/*
	 * map 函数:
	 * 参数: input; processor -> Function -> T, 参数; R, 返回值
	 */
    public static  List<String> map(List<String> input, Function<String, String> processor) {
        ArrayList<String> result = new ArrayList<String>();
        for (String obj : input) {
        	// Function apply -> 执行函数业务逻辑
            result.add(processor.apply(obj));
        }
        return result;
    }
    public static void main(String[] args) {
        List<String> input = Arrays.asList(new String[] {"apple", "orange", "pear"});
        List<String> lengths = CollectionUtils.map(input, (String v) -> String.valueOf(v.length()));
        List<String> uppercases = CollectionUtils.map(input, (String v) -> v.toUpperCase());
        System.out.println(lengths);
        System.out.println(uppercases);
    }
}


参考博客

官方文档


方法和构造方法引用


List input = Arrays.asList(new String[] {"apple", "orange", "pear"});
input.forEach((v) -> System.out.println(v));
input.forEach(System.out::println);

List dateValues = Arrays.asList(new Long[] {0L, 1000L});
List dates = CollectionUtils.map(dateValues, Date::new);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PeersLee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值