lambda与stream小结

lambda表达式相关

首先:

lambda的基本表达方式为:

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

基本特点在于:

1.可自动选声明类型//编译器可以统一识别参数值
2.可选参数圆括号//单个参数无需定义圆括号,但多个参数需要进行定义
3.可选大括号//如果主体只包含了一个语句,就不需要使用大括号
4返回关键字可选//如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

超过3行就别写这个了,改起来简直要命。

由于lambda可以直接给变量进行赋值,lambda可以直接作为一个参数传给函数,而普通的java必须要有明确的接口实现定义以及初始化才行

我假设我现在要实现一个

public static void doIt(testInterface mylambda,String strs){
    mylambda.whatToDo(s);
}

不使用lambda:

public class testImpl implements testInterface{
    @Override
    public void whatToDo(String str){
        System.out.print(str);
    }
}
testInterface tml = new testImpl();
doIt(tml,"hello");

使用lambda:

tml(s->system.out.print(s),"hello");

本质上就是缩短了代码编写的流程,允许我们通过表达式来进行代替功能接口,其简化过程可以一步步推算,基本的语法如下(例):

()->5;//无参,返回非参数为5
x->2*x//接收一个参数并且返回其2倍的值
(x,y)->x-y//返回xy的差值
(int x,int y)->x+y//返回二者的和
(string s)->system.out.print(s)//打印,并没有返回值

lambda的一些运用

例如在进行循环的时候,我要对下面的这个字符串arraylist进行打印

string[] strs={"aaa","bbb","ccc"};
List<String>all=Array.asList(strs);

一般的循环打印方式可以使用for each

for(String alls:all){
    System.out.println("这个list里面有:"+alls)
}

而用lambda则可写成:

all.forEach(all->system.out.print(all));

还是缩短了一点点的(

另外一个应用则是在匿名内部类

之前写按钮事件监听器,你需要这样

this.cancelBtn.addActionListener(new ActionListener() {		
		@Override
		public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		system.out.println("hello");
	}
});

使用lambda你可以很打程度上减少代码量

cancelbtn.addActionListener(arg0 ->system.out.println("hello"));

Stream————“只能遍历一次的高级迭代器”

先来创建一个流吧,三种方法都可以进行创建

 String[] arr = new String[]{"111", "222", "333"};
        Stream<String> stream = Arrays.stream(arr);
stream = Stream.of("111", "222", "333");
 List<String> list = new ArrayList<>();
        list.add("111");
        list.add("222");
        list.add("333");
        stream = list.stream();

此stream非 java.io 包下的 InputStreamOutputStream,他是专门用于操作集合的东西,能很大程度上简化操作

List<String> list = new ArrayList<>();
list.add("AAA");
list.add("bbb");
list.add("AAA");
list.add("ccc");

如果我要将他去重

Stream<T>distinct();//去重,返回没有相同元素的流
.count();//返回流中的元素个数
long count = list.stream().distinct().count();
//打印一下个数
System.out.println(count);

过滤 filter() 方法

Stream<String> stream = list.stream().filter(element -> element.contains("AAA"));
stream.forEach(system.out::print);
//这样就打印出了流中/集合中全部的AAA

进行元素匹配,这个对于查询很有用

anyMatch()//只要有一个元素匹配传入的条件,就返回 true
allMatch()//只有有一个元素不匹配传入的条件,就返回 false;如果全部匹配,则返回 true
noneMatch()//只要有一个元素匹配传入的条件,就返回 false;如果全部匹配,则返回 true

使用例

	List<String> list = new ArrayList<>();
        list.add("rhien");
        list.add("111");
        list.add("aaaa");
        list.add("test");


        boolean  anyMatchFlag = list.stream().anyMatch(element -> element.contains("r"));
        boolean  allMatchFlag = list.stream().allMatch(element -> element.length() > 1);
        boolean  noneMatchFlag = list.stream().noneMatch(element -> element.endsWith("a"));

		
        System.out.println(anyMatchFlag);
        System.out.println(allMatchFlag);
        System.out.println(noneMatchFlag);

进行打印后结果则是

true//rhine开头为r,返回true
true//所有元素的长度都大于1
true//aaaa的结尾为a,返回true

但我们得到了流之后,还是得把他转换成集合或者数组啊,此时则需要使用collect()方法
在这里插入图片描述

打印结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值