Java Lambda表达式和Stream(流)

本文介绍了Java 8中的Lambda表达式和Stream概念,包括它们的定义、使用场景、语法示例以及与匿名方法的关系。重点讲解了如何将lambda表达式用于Runnable接口和Stream操作,展示了函数式接口的运用和流处理集合的高效方式。
摘要由CSDN通过智能技术生成

Lambda表达式

简介

lambda表达式是java SE 8中重要的新特性,允许通过表达式来代替功能接口

功能接口即functional interface ,是只有一个显式声明的抽象方法的接口

 @FunctionalInterface
    public interface Runnable { void run(); }

lambda表达式可以为功能接口(函数式接口)赋值,也可以显式转型为一个Object

lambda表达式本身是什么类型?:由上下文推导而来即目标类型(Target type)
是一个被期待的类型。
例:

Runnable r1 = () -> {System.out.println("Hello Lambda!");};
Object obj = r1;
// ERROR! Object is not a functional interface!
Object obj = () -> {System.out.println("Hello Lambda!");}; 
// correct
Object o = (Runnable) () -> { System.out.println("hi"); }; 

使用:

//此处 不用显示声明,java可以根据上下文判断
   Thread gaoDuanDaQiShangDangCi = new Thread( () -> {
        System.out.println("This is from an anonymous method (lambda exp).");
    } );

本质

本质是一个匿名方法

 public int add(int x, int y) {
        return x + y;
    }

转换为lambda表达式:

 (int x, int y) -> x + y;
 // or
 (x, y) -> x + y; 
 // or
 (x, y) -> { return x + y; } 
 

语法

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

例:

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

使用中例子:


java8 Consumer

是一个预定义的函数式接口,可以
可以把lambda表达式实例化

Consumer<User> consumer = user1 ->user1.setName("11");

consumer.accept(user);

Stream

简介

Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包(函数式接口)以及 java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。

流是一个来自数据源的元素队列并支持聚合操作

数据源可以是集合,数组,I/O channel,generator等。

生成 流 : stream() 为集合创建串行流
parallelStream(),为集合创建并行流

例:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

流还带来了很多函数如foreach,map,filter,limit,sorted

iterator

迭代器
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

while(iterator.hasNext()) {
            //iterator.next()返回迭代的下一个元素
            System.out.println(iterator.next());
        }

番外 对foreach循环的理解

例:

public void test1() {   
    //定义并初始化一个数组   
    int arr[] = {2, 3, 1};   
     System.out.println("----1----排序前的一维数组");   
    for (int x : arr) {   
         System.out.println(x); //逐个输出数组元素的值   
     }   

    //对数组排序   
     Arrays.sort(arr);   

    //利用java新特性for each循环输出数组   
     System.out.println("----1----排序后的一维数组");   
    for (int x : arr) {   
         System.out.println(x); //逐个输出数组元素的值   
     }   
 }   

优点:代码量减少 方便对容器进行遍历
缺点:没有索引 不能操作容器里面的元素。

引用:

1.https://blog.csdn.net/qq_32671287/article/details/79420736
2.https://www.runoob.com/java/java8-streams.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值