Lambda表达式

1.是对匿名内部类对象的一种格式的简化

2.Java8中引入了一个新的运算符"->",称为箭头运算符,或者lambda运算符

3.作用就是分割前后两部分的

4.左边:表示的是Lambda表达式的参数列表(接口中,定义的抽象方法的参数)

5.右边:表示的是方法的方法体,Lambda体

语法格式的书写

1.没有参数,也没有返回值

左面的小括号不能省,右边的大括号可以省略也可以不用省

java-13.png

2.有一个参数,没有返回值

有多个参数,没有返回值

左边的括号 可省可不省,右边的大括号可以省也可以不用省

java-14.png

3.接口中需要重写的方法内容有很多,需要给多句话的加上大括号

java-15.png

注意事项:如果Lambda体中的语句有只有一句,那么大括号可以省略不写;如果大扩号中只有一条语句,并并且是return语句,那么return关键字可以省略不写

函数式接口

Lambda表达式使用的前提,就是接口必须是函数式接口,如果在接口中,只有一个抽象方法,那么这个接口就是函数式接口,常用一个注解来检查当前接口是否是一个函数式接口@FunctionalInterface,如果不是函数式接口,则编译报错

作用:

想表达的是一个方法的内容,由于方法不在任何类中,所有被称为函数,接口其实想表达的就一个函数的声明,接下来的使用这个接口的实现类对象,来表达一个函数的体现

消费型接口:

抽象方法:void accept(T t)

当某个函数可以接受一个数据,并且处理这个数据,处理完成之后,就不需要返回任何数据,这个函数需要当做数据来进行传递,就使用消费型接口

package cn.ujiuye.function;
import java.util.function.Consumer;
import cn.ujiuye.domin.Mobile;
/**
 * @author liugang
 * 消费型接口方式
 */
public class CustmoerTest {
     public static void main(String[] args) {
	    Mobile m = new Mobile("华为",3000);
	     //lambad表达式实现赋值  内部显然是对消费者接口的使用,故是对函数式接口编程的新东西
	     updateMobile(m, x -> x.setPrice(x.getPrice() + 1000 ));
	     System.out.println(m);
	 }
    //调用其使用的方法
	private static void updateMobile(Mobile m, Consumer<Mobile> con) {
	     for (int i = 0; i < 3; i++) {
		     con.accept(m);	
		 }
	}
}

方法引用

1.写一个函数式接口时,方法的实现,已经被某个其他的对象实现了,就不需要在Lambda中了,再次调用这个实现,而可以那个直接定义好的方法了

2.格式

函数式接口: 名称 = 对象名 :: 方法名称

函数式接口: 名称 = 类名::静态方法名

3.作用

把已经实现的当做一个数据,作为一个引用,赋值给某个函数式接口的引用,可以把这个引用当做方法的返回值,也可以作为一个实现类对象

java-16.png

StreamingAPI

在jdk1.8中,提供了一个stream类型,可以很方便的操作容器中的数据,不需要手动定义循环就可以完成对数据的过滤,输出及其其他的操作

Stream的类型的获取和常用方法

Collection的获取:

调用stream()方法,调回Stream对象

终止方法:foreach count

延迟方法:filter limit skip 等

package cn.ujiuye.stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
/**
 * @author liugang
 *
 */
public class StreamApiDemo03Demo03 {
    public static void main(String[] args) {
    	//定义一个集合,并获取stream类型的数据
		List<Integer> list = new ArrayList<Integer>();
		Collections.addAll(list, 12,32,-13,50,100);
		Stream<Integer> stream = list.stream();
		stream.forEach(x ->System.out.println(x - 100));
		System.out.println(list.stream().count());
    }
}

package cn.ujiuye.stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;
/**
 * @author liugang
 * Stream中一些方法的使用
 */
public class StreamApiDemo04 {
   public static void main(String[] args) {
	   ArrayList<Integer> list = new ArrayList<>();
	   Collections.addAll(list, -4,-12,-199,0,15,25,36,100);
	   Stream<Integer> stream = list.stream();
	   stream.filter(x -> x > 0)    //过滤
	         .skip(1)               //跳过
	         .limit(2)              //限制
	         .sorted((x,y) -> -1)   //排序
	         .forEach(System.out::println);
   }
}

练习

有两个Arraylist集合,存储队伍中的多个成员姓名,使用Stream方式,对以下步骤进行操作

1、第一个队伍只要名字为3个字的成员姓名

2、第一个队伍只要筛选之后的前三个人

3、第二个队伍只要姓张的

4、第二个队伍筛选之后不要前两个人

5、将两个队伍合并成一个队伍

6、合并之后的队伍中的所有人的Person(自定义类型)对象,存储到一个ArrayList集合中

队伍1:宫本武藏、宋公明、苏有朋、石头人、时传祥、李耳、庄子、洪七公

队伍2:帕瓦罗蒂、张三疯、赵薇薇、张自忠、孛儿只斤铁木真、张天爱、张翠花

public class StreamApiTest {
    @SuppressWarnings("unused")
	public static void main(String[] args) {
	    //创建集合
    	List<String> list1 = new ArrayList<String>();
	    List<String> list2 = new ArrayList<String>();
	    //把元素添加到集合中
	    Collections.addAll(list1, "宫本武藏","宋公明","苏有朋","石头人","时传祥","李耳","庄子","洪七公");
	    Collections.addAll(list2, "帕瓦罗蒂","张三疯","赵薇薇","张自忠","孛儿只斤铁木真","张天爱","张翠花");
	    //创建Stream对象
	    Stream<String> stream1 = list1.stream();
	    Stream<String> stream2 = list2.stream();
	    //创建筛选后的元素
	    Stream<String> limit1 = stream1.filter(x -> x.length() == 3).limit(3);
	    Stream<String> limit2 = stream2.filter(x -> x.startsWith("张")).skip(2);
	    //将两对的人合到同一个对里
	    Stream<String> concat = Stream.concat(limit1, limit2);
	    //定义一个集合用来存对象
	    List<Person> list = new ArrayList<Person>();
	    //想要的是一个Person对象的流
	    //Stream<Person> map = concat.map(x -> new Person(x);
	    Stream<Person> map = concat.map(Person::new);
	    //将流对象添加到集合中
	    map.forEach(list::add);
	    System.out.println(list);
	}
}

以上就是Java8新特性的lambda,函数式接口,StreamingAPI的详细内容,更多请关注自学java网其它相关文章!

声明:有的资源均来自网络转载,版权归原作者所有,如有侵犯到您的权益 请联系邮箱:our333@126.com我们将配合处理!

原文地址:Java8新特性的lambda,函数式接口,StreamingAPI发布于2021-11-26 11:16:27