详解lambda表达式

一、概述

Lambda表达式是Java8中的新特性,编码时,我们一般尽可能轻量级的将代码封装为数据,传统的解决方案是通过接口和实现类(匿名内部类)实现,这中方式存在语法冗余,this关键字,变量捕捉,数据控制等问题

例如线程的创建:

通过lambda表达式实现:

二、基础语法

   1、函数式接口(function interface)

        简单来说就是只包含一个接口方法的特殊接口,通过@FunctionalInterface注解标注

    注意:1、函数式接口中默认接口和静态接口可以正常使用

               2、由于Java中所有的类都默认继承自Object类,所以继承自Object类中的接口也可以在函数式接口中使用

扫描二维码关注公众号,回复: 12410590 查看本文章

    2、Lambda表达式实现函数式接口

        定义一个接口

   

       实现类:

     

3、Java类型系统内部的函数式接口 

    Java8中的java.util.function包中提供了一些常用的函数式功能接口   

// java.util.function.Predicate<T>
// 接收参数T,返回一个Boolean类型的结果
Predicate<String> predicate = String::isEmpty;
// java.util.function.Consumer<T>
// 接收一个参数T,不返回结果
Consumer<String> consumer = System.out::println;
// java.util.function.Function<T,R>
// 接收参数对象T,返回结果对象R
Function<String, Integer> function = (String userName) ->{
    return userName.equals("admin") ? 1 : 0;

};
// java.util.function.Supplier<T>
// 不接收参数,返回T对象创建的工厂
Supplier<String> supplier = () -> UUID.randomUUID().toString();
// java.util.UnaryOperator<T>
// 接收参数对象T,返回结果参数对象T
UnaryOperator<String> operator = (String userName) -> "Hello " + userName;
//java.util.BinaryOperator<T>
// 接收两个T对象,返回一个T对象结果
BinaryOperator<String> binary = (String userName, String userId) -> {
    return userName + ":" + userId;

}; 

注: 1、lambda表达式 必须和接口进行绑定

   2、lambda表达式,可以附带0到n个参数,括号中的参数类型可以不用指定,jvm在运行时,会自动根据绑定的抽象方法中的参数进行推导

    3、lambda表达式,如果代码块只有一行,可以省略大括号,和return关键字,单行代码的执行结果会自动返回

  4、Lambda表达式的类型检查

public static void main(String[] args) {

    test((n, r) -> {

        r.add(n);

        return r;

    });

}

public static void test(IInterface<String, List> iInterface) {

    iInterface.compar("admin", new ArrayList());

}

@FunctionalInterface

public interface IInterface<T, R> {

    R compar(T t, R r);

}

 

 

三、Lambda表达式在集合中的应用

     1、方法的调用

List<Integer> list = Arrays.asList(33,44,55,33,22);

// 1、匿名内部类的方式

Collections.sort(list, new Comparator<Integer>() {

    @Override

    public int compare(Integer o1, Integer o2) {

        return o1 - o2;

    }

});

// 2、lambda 表达式的方式
Collections.sort(list, (p1, p2) -> p1 - p2); 
// 3、静态方法的引用
 Collections.sort(list, LambdbTest::compar);

public static int compar(Integer p1, Integer p2) {
    return p1-p2;

}
2、获取stream对象
// 1、批量数据,stream对象

Stream stream = Stream.of("admin", "ossuser");

// 2、数组

int[] array = new int[]{1,3,4};

IntStream stream1 = Arrays.stream(array);

// 2、集合

List<String> list = Arrays.asList("admin", "ossuser");

Stream<String> stream2 = list.stream();

// 3、Map

Map<String, String> map = new HashMap<>();

map.put("name", "admin");

Stream<Map.Entry<String, String>> stream3 = map.entrySet().stream();

// 3、stream对基类型类型的功能封装

IntStream intStream = IntStream.of(3);

IntStream.range(1, 5).forEach(System.out::println); // 左闭右开

IntStream.rangeClosed(1, 5).forEach(System.out::println); // 左闭又闭
3、Stream对象,转为指定数据 
// 1、数组

Object[] ints = stream.toArray(String[]::new);

// 2、字符串

String collect1 = stream.collect(Collectors.joining()).toString();

// 3、集合

List<String> list1 = (List<String>) stream.collect(Collectors.toList());

// 4、map

Map<String, String> map1 = (Map<String, String>) stream.collect(Collectors.toMap(x -> x, y -> "value" + y));
3、常见API的操作
List<String> list2 = Arrays.asList("admin", "user", "ossuser");

// 1、map() 中间操作,map()方法接收一个Function接口

List<String> strings = list2.stream().map(x -> x + "test").collect(Collectors.toList());

// 2、filter() 添加过滤条件,过滤满足条件的用户

List<String> collect = list2.stream().filter(x -> x.length() > 2).collect(Collectors.toList());

// 3、forEach 增强型循环

list2.forEach(System.out::print);

// 4、peek() 中间操作,迭代数据依次处理过程,实现数据的多次迭代

list2.stream()

        .peek(x -> System.out.println(x + "1"))

        .peek(x -> System.out.println(x + "2"))

        .forEach(System.out::println);

// 5、skip()  中间操作,有状态,跳过部分数据

list2.stream().skip(1).forEach(System.out::println);

// 6、limit() 中间操作,有状态,限制输出数据量

list2.stream().limit(2).forEach(System.out::println);

// 7、distinct() 中间操作,有状态,去重

list2.stream().distinct().forEach(System.out::println);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 概述

Lambda表达式是Java8中的新特性,编码是,一般尽可能轻量级的将代码封装为数据,传统的解决方案是通过接口和实现类(匿名内部类)实现,这中方式存在语法冗余,this关键字,变量捕捉,数据控制等问题

Lambda表达式,是对这块代码的一个优化

例如线程的创建:

 

通过lambda表达式实现:

 

  • 基础语法
  1. 函数式接口(function interface)

简单来说就是只包含一个接口方法的特殊接口,通过@FunctionalInterface注解标注

注意:1、函数式接口中默认接口和静态接口可以正常使用

2、由于Java中所有的类都默认继承自Object类,所以继承自Object类中的接口也可以在函数式接口中使用

  1. Lambda表达式实现函数式接口

定义一个接口

 

实现类:

 

  1. Java类型系统内部的函数式接口
Java8中的java.util.function包中提供了一些常用的函数式功能接口
            // java.util.function.Predicate<T>

// 接收参数T,返回一个Boolean类型的结果

Predicate<String> predicate = String::isEmpty;

// java.util.function.Consumer<T>

// 接收一个参数T,不返回结果

Consumer<String> consumer = System.out::println;

// java.util.function.Function<T,R>

// 接收参数对象T,返回结果对象R

Function<String, Integer> function = (String userName) ->{

    return userName.equals("admin") ? 1 : 0;

};

// java.util.function.Supplier<T>

// 不接收参数,返回T对象创建的工厂

Supplier<String> supplier = () -> UUID.randomUUID().toString();

// java.util.UnaryOperator<T>

// 接收参数对象T,返回结果参数对象T

UnaryOperator<String> operator = (String userName) -> "Hello " + userName;

//java.util.BinaryOperator<T>

// 接收两个T对象,返回一个T对象结果

BinaryOperator<String> binary = (String userName, String userId) -> {

    return userName + ":" + userId;

};
 
 
注:1、lambda表达式 必须和接口进行绑定
   2、lambda表达式,可以附带0到n个参数,括号中的参数类型可以不用指定,jvm在运行时,会自动根据绑定的抽象方法中的参数进行推导
   3、lambda表达式,如果代码块只有一行,可以省略大括号,和return关键字,单行代码的执行结果会自动返回

 

  1. Lambda表达式的类型检查
public static void main(String[] args) {

    test((n, r) -> {

        r.add(n);

        return r;

    });

}

public static void test(IInterface<String, List> iInterface) {

    iInterface.compar("admin", new ArrayList());

}

@FunctionalInterface

public interface IInterface<T, R> {

    R compar(T t, R r);

}

 

 

  • Lambda表达式在集合中的应用

1、方法的调用

List<Integer> list = Arrays.asList(33,44,55,33,22);

// 1、匿名内部类的方式

Collections.sort(list, new Comparator<Integer>() {

    @Override

    public int compare(Integer o1, Integer o2) {

        return o1 - o2;

    }

});

// 2、lambda 表达式的方式

Collections.sort(list, (p1, p2) -> p1 - p2);
 
 // 3、静态方法的引用

 Collections.sort(list, LambdbTest::compar);

public static int compar(Integer p1, Integer p2) {

    return p1-p2;

}
2、获取stream对象
// 1、批量数据,stream对象

Stream stream = Stream.of("admin", "ossuser");

// 2、数组

int[] array = new int[]{1,3,4};

IntStream stream1 = Arrays.stream(array);

// 2、集合

List<String> list = Arrays.asList("admin", "ossuser");

Stream<String> stream2 = list.stream();

// 3、Map

Map<String, String> map = new HashMap<>();

map.put("name", "admin");

Stream<Map.Entry<String, String>> stream3 = map.entrySet().stream();

// 3、stream对基类型类型的功能封装

IntStream intStream = IntStream.of(3);

IntStream.range(1, 5).forEach(System.out::println); // 左闭右开

IntStream.rangeClosed(1, 5).forEach(System.out::println); // 左闭又闭
3、Stream对象,转为指定数据 
// 1、数组

Object[] ints = stream.toArray(String[]::new);

// 2、字符串

String collect1 = stream.collect(Collectors.joining()).toString();

// 3、集合

List<String> list1 = (List<String>) stream.collect(Collectors.toList());

// 4、map

Map<String, String> map1 = (Map<String, String>) stream.collect(Collectors.toMap(x -> x, y -> "value" + y));
3、常见API的操作
List<String> list2 = Arrays.asList("admin", "user", "ossuser");

// 1、map() 中间操作,map()方法接收一个Function接口

List<String> strings = list2.stream().map(x -> x + "test").collect(Collectors.toList());

// 2、filter() 添加过滤条件,过滤满足条件的用户

List<String> collect = list2.stream().filter(x -> x.length() > 2).collect(Collectors.toList());

// 3、forEach 增强型循环

list2.forEach(System.out::print);

// 4、peek() 中间操作,迭代数据依次处理过程,实现数据的多次迭代

list2.stream()

        .peek(x -> System.out.println(x + "1"))

        .peek(x -> System.out.println(x + "2"))

        .forEach(System.out::println);

// 5、skip()  中间操作,有状态,跳过部分数据

list2.stream().skip(1).forEach(System.out::println);

// 6、limit() 中间操作,有状态,限制输出数据量

list2.stream().limit(2).forEach(System.out::println);

// 7、distinct() 中间操作,有状态,去重

list2.stream().distinct().forEach(System.out::println);
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 概述

Lambda表达式是Java8中的新特性,编码是,一般尽可能轻量级的将代码封装为数据,传统的解决方案是通过接口和实现类(匿名内部类)实现,这中方式存在语法冗余,this关键字,变量捕捉,数据控制等问题

Lambda表达式,是对这块代码的一个优化

例如线程的创建:

通过lambda表达式实现:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/fengkuagn123/article/details/106315317
今日推荐