javaLambda

Lambda Java

最近回顾一下,写个笔记。

最前面

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。

Lambda语法范式

(parameters) -> expression
//或
(parameters) ->{ statements; }

基础示例

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x  y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

典型示例

  • 比较器写法主要有名内部类写法与Lambda表达式写法。
  • 主要为定制排序,常见的有:字符串长度排序,字符串首字母排序,字符串结尾字母排序,主要与Arrays.sort()stream().sorted()结合使用。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class testLambda {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("piccolo");
        list.add("dave");
        list.add("dava");
        list.add("mia");
        list.add("maybe");

        List<Integer> numList = Arrays.asList(1,2,3,4,5);

        String[] strArrays = {"piccolo",
                "dave",
                "dava",
                "mia",
                "maybe"};

        // 1).字符串长度 增序输出
        System.out.println("比较器定制排序:字符串长度增序");

        System.out.println("### Arrays.sort() 相同长度不做顺序变化");
        Arrays.sort(strArrays, (String s1, String s2) -> (s1.length() - s2.length()));
        Arrays.stream(strArrays).forEach(System.out::println);

        System.out.println("### Arrays.sort() 相同长度按照字符串大小增序");
        Arrays.sort(strArrays, (String s1, String s2) ->
                ((s1.length() - s2.length())==0?s1.compareTo(s2):(s1.length() - s2.length()))
        );
        Arrays.stream(strArrays).forEach(System.out::println);

        System.out.println("### stream().sorted() 相同长度按照字符串大小增序");
        list.stream().sorted((s1,s2) -> {
            int num = s1.length()-s2.length();
            int num2 = num==0?s1.compareTo(s2):num;//s1.compareTo(s2) s1大于s2 返回1,反之,返回-1  这里对同等长度的还比较了一下字符大小
            return num2;//num2 为正时,s1比s2长,返回为正,表示按长度增序
        }).forEach(System.out::println);
        System.out.println("++++++++++++++++");
        
    }
}

补充;其余比较类型示例

//匿名内部类写法替代lambda写法
Arrays.sort(strArrays, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return (s1.length() - s2.length());
    }
});

// 其余比较类型用例
//按照字符串大小增序
Comparator<String> sortByStringValue = (String s1, String s2) -> (s1.compareTo(s2)); 
//按照字符串最后一个字符大小增序
Comparator<String> sortByLastCharValue = (String s1, String s2) -> (s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1));  
//实现Runnable接口

// 1使用匿名内部类  
new Thread(new Runnable() {  
    @Override  
    public void run() {  
        System.out.println("Hello Thread !");  
    }  
}).start();  
// 2使用 lambda expression  
new Thread(() -> System.out.println("Hello Thread !")).start();  
  
// 1使用匿名内部类  
Runnable race1 = new Runnable() {  
    @Override  
    public void run() {  
        System.out.println("Hello Runnable  !");  
    }  
};   
// 2使用 lambda expression  
Runnable race2 = () -> System.out.println("Hello Runnable  !");  
   
// 直接调用 run 方法(没开新线程)  
race1.run();  
race2.run();