Java lambda表达式

102 阅读1分钟

Lambda表达式简介

在Java中,Lambda表达式是一种函数式接口的实例,它可以作为参数传递给方法或存储在变量中。Lambda表达式允许以一种简洁的方式定义匿名函数,使得在Java中使用函数式编程更加方便。 Lambda表达式的定义遵循以下语法形式:

parameter -> expression
(parameter1, parameter2) -> expression
(parameter1, parameter2) -> { code block }

例子

public class lambda_demo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.forEach((n) -> {
            System.out.println(n);
        });
    }
}

使用lambda筛选(Filter)

public class filter_demo {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("万里", "千里", "伍六一");
        List<String> longName = names.stream().filter(n -> n.length() >= 3).collect(Collectors.toList());
        for (String s: longName) {
            System.out.println(s);
        }
    }
}

// 伍六一

使用lambda映射(Map)

public class filter_demo {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
        List<String> upperCaseNames = names.stream().map(n -> n.toUpperCase()).collect(Collectors.toList());
        for (String s: upperCaseNames) {
            System.out.println(s);
        }
    }
}

使用lambda排序(Sort)

public class filter_demo {
    public static void main(String[] args) {
        List<String> nums = Arrays.asList("1", "2", "3");
        List<String> sortedNums = nums.stream().sorted((n1, n2) -> n2.compareTo(n1)).collect(Collectors.toList());
        for (String s: sortedNums) {
            System.out.println(s);
        }
    }
}

// 3
// 2
// 1

使用Consumer存储变量

使用 Java Consumer 的接口将 lambda 表达式存储在变量中:

public class lambda_demo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        Consumer<Integer> method = (n) -> {
            System.out.println(n);
        };

        list.forEach(method);
    }
}

创建一个将 lambda 表达式作为参数的方法:

interface StringFun{
    String run(String str);
}

public class lambda_demo {
    public static void printFormatted(String str, StringFun formate) {
        String result = formate.run(str);
        System.out.println(result);
    }
    public static void main(String[] args) {
        StringFun exclaim = s -> s + "!";
        StringFun ask = x -> x + '?';

        printFormatted("hello", exclaim);
        printFormatted("hello", ask);
    }
}

使用操作符::分割方法名和类或对象

函数引用:引用⼀个已经存在的方法,使其替代lambda表达式完成接口的实现。

interface TestI{
    int test(int a,int b);
}

public class filter_demo {
    public static void main(String[] args) {
        TestI test1 = Calculator::calculate;
        System.out.println(test1.test(4,5));
    }
}

class Calculator{
    public static int calculate(int a,int b ){
        if (a > b) {
            return a - b;
        }
        return b - a;
    }
}