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 包下的 InputStream 和 OutputStream,他是专门用于操作集合的东西,能很大程度上简化操作
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()方法
打印结果如下: