语法:(parameters) -> expression 例: 接受2个参数(数字),并返回他们的差值 (x, y) -> x – y
用法: 定义一个接口,接口里面定义一个方法,在用这个接口名声明一个对象,对象存表达式,
最后用 对象.方法(带实参)
变量作用域: lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改。
在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
语法是 Class::new,或者更一般的Class< T >::new
例:
//传统Lambda方式
Supplier studentSupplier = ()-> new Student();
Student student = studentSupplier.get();
System.out.println(student);//Student{name='null', age=0}
//构造器引用
studentSupplier = Student::new;
student = studentSupplier.get();
System.out.println(student);//Student{name='null', age=0}
语法是 Class::静态方法名,
例: //传统Lambda表达式
Consumer consumer = (str) -> sop(str);
consumer.accept(“Hello : XiangYang”); //打印:Hello : XiangYang
//方法引用方式
consumer = Test::sop;
consumer.accept("Hello : XiangYang"); //打印:Hello : XiangYang
语法是 类名::method
例:Student student = new Student(“XiangYang”,23);
Supplier supplier = ()->student.getName();
System.out.println("Lambda形式: "+supplier.get());
Supplier supplier1 = student :: getName;
System.out.println("方法引用形式: "+supplier1.get());
语法是 实例::method
例:final Car police = Car.create( Car::new );
cars.forEach( police::follow );
1.Predicate 它接受一个输入参数 T以及类型,返回一个布尔值结果。
例:链接:https://www.runoob.com/java/java8-functional-interfaces.html
2.accept(T t) 它接受一个输入参数 T以及类型,没有返回值。
例: Consumer consumer = (x) -> System.out.println(x);
consumer.accept("Hi: 我是Lambda表达式实现的!"); //打印:Hi: 我是Lambda表达式实现的!
3.Function 接受一个输入参数,返回一个结果。
4.Consumer 代表了接受一个输入参数并且无返回的操作。
Stream 提供了新的方法 'forEach' 来迭代流中的每个数据
例: random.ints().limit(10).forEach(System.out::println)
map 方法用于映射每个元素到对应的结果
用法: 涉及到取或者用集合中的元素,用.map(类型::getValues())
例: List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());//输出i的平方的集合
对字符串操作:
memberNames.stream().filter((s) -> s.startsWith("A")).map(String toUpperCase) .forEach(System.out::println); //输出包含A的单词
对键值对操作:
stream.map((value) -> value.toUpperCase());
filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:
例:long count = strings.stream().filter(string -> string.isEmpty()).count();
limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:
例:random.ints().limit(10).forEach(System.out::println);
sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:
例:random.ints().limit(10).sorted().forEach(System.out::println);
count()返回符合条件的数量
例:long totalMatched = memberNames.stream() .filter((s) -> s.startsWith("A")) .count();
System.out.println(totalMatched);
Output: //输出有2个包含A的单词
forEach():遍历流。
distinct():去掉重复的数据
min()/max():找到最小/大元素
例:Optional minNumber = list.stream().min((i, j) -> i.compareTo(j));
System.out.println(minNumber.get());//输出最小的元素
builder模式:(链式调用)下面的属性可随意增减
new 类名.Builder(context)
.setName("kimber.wang")
.setTiltle("问题")
.setMessage("请问你多大了")
.build()
1.Stream.of(val1, val2, val3….)
例:Stream stream = Stream.of(1,2,3,4,5,6,7,8,9);
stream.forEach(p -> System.out.println(p));
2.Stream.of(arrayOfElements)
例:Stream stream = Stream.of( new Integer[]{1,2,3,4,5,6,7,8,9} );
stream.forEach(p -> System.out.println(p));
3.List.stream()
例: List list = new ArrayList();
for(int i = 1; i< 10; i++){
list.add(i);
}
stream stream = list.stream();
stream.forEach(p -> System.out.println(p));
创建一个list集合,同上
stream stream = list.stream();
List evenNumbersList = stream.filter(i -> i%2 == 0).collect(Collectors.toList());
转换成array ( Stream.toArray( EntryType[]::new ))
(Integer[] evenNumbersArr = stream.filter(i -> i%2 == 0).toArray(Integer[]::new);)
System.out.print(evenNumbersList);