Lambda表达式与Stream流

一、Lambda表达式

        Lambda表达式: lambda表达式被称为闭包。函数式编程,就是为了简化代码,让代码更加简洁。

        下边举个例子。下面两个线程都可以打印相应的内容,其中runnable1是内部类写法,runnable是对应的Lambda表达式写法。

public class Demo {
    public static void main(String[] args) {

        //当接口下面只有一个抽象方法的时候 可以简写
        Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("我是内部类输出");
            }
        };

        Runnable runnable2 = ()-> System.out.println("我是Lambda表达式输出");

        new Thread(runnable1).start();
        new Thread(runnable2).start();
    }
}

二、Lambda表达式的语法格式

函数式接口,接口下面有且只有有一个抽象类,才能使用Lambada

接口  接口对象 = ()->表达式;    无参无返回值的
接口  接口对象 = (parameter)->表达式;    有参无返回值的
接口  接口对象 = ()->{表达式;}    无参有返回值的
接口  接口对象 = (parameter)->{表达式;}    有参有返回值的

2.1、无参无返回值的

interface Computer {
    void coding();
}

public class Demo {
    public static void main(String[] args) {
        //接口 接口对象 = ()->表达式;
        //第一种的展开写法
        Computer computer = ()-> System.out.println("敲代码");
        test(computer);
        //第一种
        test(()-> System.out.println("嗷嗷叫的敲代码"));
       
        //第二种
        test(()-> System.out.println("打游戏"));
        //第二种的展开写法
        test(new Computer() {
           	@Override
           	public void coding() {
              System.out.println("嗷嗷叫的打游戏");
          	}
      	});
	}
    public static void test (Computer computer) {
        computer.coding();
    }
}

2.2、有参无返回值

interface A {
    void eat (String name, int age);
}
public class Demo {
    public static void main(String[] args) {
        //展开写法
        test(new A() {
            @Override
            public void eat(String name, int age) {
                System.out.println(name+ "年龄为:" + age + ",在吃黄焖鸡");
            }
        }, "张三", 12);

        //把方法中的接口变成了lambada表达式
        //接口 接口对象 = (parameter)->表达式;
        //Lambda表达式写法
        test((name, age)-> System.out.println(name+ "年龄为:" + age + ",在吃大盘鸡"), "李四", 24);
    }
    public static void test (A a, String name, int age) {
        a.eat(name, age);
    }
}

2.3、无参有返回值

interface B {
    int num();
}
public class Demo {
    public static void main(String[] args) {
        //展开写法
        test(new B() {
            @Override
            public int num() {
                return 50;
            }
        });
        
        //lambda表达式写法
        test(()->{return 50;});
    }
    
    public static void test (B b) {
        System.out.println(b.num());
    }
}

2.4、有参有返回值

interface C {
    int add(int a, int b);
}
public class Demo1 {
    public static void main(String[] args) {

        test((a, b) -> a + b, 4, 5);
    }
    public static  void test(C c, int a, int b) {
        int sum = c.add(a, b);
        System.out.println(sum);
    }
}

三、Stream流

        基于Lambda之后,jdk8又引入一个关于集合类库目前的弊端的解决方案。叫stream流。

//通过list集合获取流对象,也可以用set集合
	ArrayList<String> strings = new ArrayList<>();
    strings.add("张三");
    strings.add("李四");
    strings.add("王五");
    System.out.println(strings);
    //可以list集合变成一个流对象
    Stream<String> stream = strings.stream();
    System.out.println(stream);//内存地址

//也可以用map集合获取流对象
	Set<Map.Entry<String, String>> entries = maps.entrySet();
	Stream<Map.Entry<String, String>> stream = entries.stream();

四、Stream流对象下面的方法

方法的名字方法的作用方法种类是否支持链式操作
count统计个数终结方法
forEach遍历数据的终结方法
filter过滤数据可以拼接
limit取前几个数据可以拼接
skip跳过前几个可以拼接
map映射方法可以拼接
concat拼接可以拼接

非终结方法可以调用其他方法

count  :统计流中的个数,返回值是long类型的数据(写在最后)
forEach:  遍历流中数据的(写在最后)

//filter方法:
Stream<T> filter(Predicate<? super T> predicate)
//strings.stream().filter(new Predicate<String>() {
//     @Override
//     public boolean test(String s) {
//          //s流中字符串每个的数据
//          boolean b = s.endsWith("坤");
//          return b;
//     }
    
limit  :限制输出个数
skip  :跳过前边的几个值
    
concat  :合并两个流
//Stream.concat(stream, stream1)

map :处理映射关系
//map((s)->Integer.parseInt(s))
//strings.stream().map(new Function<String, Integer>() {
//     @Override
//     public Integer apply(String s) {
//          int i = Integer.parseInt(s);
//          return i;
//      }
//)

五、收集流

        真实的开发的时候,最终的结果还是集合 流只是扮演了中间处理数据的角色。

stream.collect(Collectors.toList())		toList();   将流转为List集合

stream.collect(Collectors.toSet())		toSet();  将流转为Set集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值