1,什么是Lambda表达式:
Lambda表达式理解:匿名函数的替代,Lambda允许将函数作为一个方法的参数传递。一般有函数式接口的类都可以使用Lambda表达式书写。
2,什么是函数式接口:
只有一个抽象方法的接口,可以有其他普通方法,只能一个抽象方法,一般有注解:@Functioninterface
3,Lambda表达式基本语法:
->(箭头符号),将表达式分为2部分,左边:(参数1,参数2..)表示参数列表,右边:{}内部是方法体
函数式接口 变量名=(参数1,参数2...)->{//方法体}
例子1:
/**
* @author lyx
* @create 2020-04-21 21:13
*/
public class Lamdba {
public static void main(String[] args) {
// Lambda表达式基本语法:
// 函数式接口 变量名=(参数1,参数2...)->{//方法体}
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(1);
}
}).start();
// Lamdba方式
new Thread( //run()之前的代码,包含run名称,省略了。把不变的代码去掉,只写逻辑的部分。还有Lambda表达式会自动识别返回值,因此不用担心返回值问题。
// new Runnable() { @Override public void run() {
()->System.out.println(3)
).start();
System.out.println(2);
}
}
例子2:
//按字符串长度排序
public static void Example2(){
/* TreeSet<String> ts=new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.length()-o1.length();
}
});*/
TreeSet<String> ts=new TreeSet<String>(
(o1, o2) -> o2.length()-o1.length()
);
ts.add("abc");
ts.add("a");
ts.add("abcdefff");
ts.add("abes");
System.out.println(ts);//[abcdefff, abes, abc, a]
}
4,函数式接口是Lambda表达式和方法引用的目标类型。主要分为四大类:
4-1,消费型接口(Comsumer)特点:有参数无返回值
4-2,供给型接口(Supplier)特点:无参数有返回值
4-3,判断型接口(Predicate)特点:返回boolean
4-4,功能型接口(Function)特点:有参数有返回值
java.util.funtion包
不提供无参数无返回值。
Stream流
1,
Stream特点: Stream自己不会存储元素 Stream不会改变源对象,相反他们会返回一个持有结果的新Stream Stream操作是延迟执行的,意味着他们会等到需要结果的时候才执行。
2,
使用Stream对象三步走: 1,创建Stream 2,使用Stream处理,只处理,不存储元素,不会改变源对象 3,终结结果,输出。
中间操作:特点,基本都返回Stream类型 filter() distinct() limit() skip() peek() sorted() map() flatMap() 终结操作:特点:基本不会再返回Stream类型 forEach() count() max() min() allMatch() anyMatch() noneMatch() collection() 更多方法查看文档: 中文:https://www.matools.com/api/java8 英文:https://docs.oracle.com/javase/8/docs/api/index.html
例1
/* allMatch(IntPredicate predicate) //IntPredicate判断型接口,boolean类型
返回此流的所有元素是否与提供的谓词匹配。
anyMatch(IntPredicate predicate)
返回此流的任何元素是否与提供的谓词匹配。
noneMatch(IntPredicate predicate)
返回此流的元素是否与提供的谓词匹配。*/
public static void a(){
List<User> list=new ArrayList<User>();
list.add(new User(10,"zs"));
list.add(new User(13,"lx"));
list.add(new User(15,"ww"));
list.add(new User(15,"ww"));
Stream<User> stream = list.stream();
// boolean b = stream.allMatch(t -> 10 == t.getAge() && "zs".equals(t.getName()));
// System.out.println(b);//false
// boolean b1 = stream.anyMatch(t -> 10 == t.getAge() && "zs".equals(t.getName()));
// System.out.println(b1);//true
boolean b2= stream.noneMatch(t -> 10 == t.getAge() && "zs".equals(t.getName()));
System.out.println(b2);//false
}
例2
/* long count()
返回此流中的元素数。
static IntStream of(int t)
返回一个包含单个元素的顺序 IntStream 。即创建流
java.util.stream.IntStream skip(long n)
在丢弃流的第一个 n元素后,返回由该流的 n元素组成的流。*/
public static void a(){
Stream<Integer> stream = Stream.of(1, 22, 41, 5, 73, 9);
stream = stream.skip(2);//跳过第二个数,22
stream.forEach(System.out::print);//41 5 73 9
// long count = stream.count();
// System.out.println(count);//6
}
例 3
/* IntStream distinct()//去重,依赖equal(),需要重写该方法才会生效,
有参数无返回值
返回由该流的不同元素组成的流。*/
public static void a(){
List<User> list=new ArrayList<User>();
list.add(new User(10,"zs"));
list.add(new User(13,"lx"));
list.add(new User(15,"ww"));
list.add(new User(15,"ww"));
Stream<User> stream = list.stream();
stream.distinct().forEach((t)->{
System.out.print(t.getName());//zslxww
});
}
例4
/* Stream<T> filter(Predicate<? super T> predicate)//boolean类型
返回由与此给定谓词匹配的此流的元素组成的流。*/
public static void a(){
List<User> list=new ArrayList<User>();
list.add(new User(10,"zs"));
list.add(new User(13,"lx"));
list.add(new User(15,"ww"));
Stream<User> stream = list.stream();
stream.filter(t-> !"zs".equals(t.getName()))
.forEach(t->System.out.print(t.getName()));//lxww
}