您好,欢迎访问一九零五行业门户网

Java8新特性的lambda,函数式接口,StreamingAPI

lambda表达式
1.是对匿名内部类对象的一种格式的简化
2.java8中引入了一个新的运算符->,称为箭头运算符,或者lambda运算符
3.作用就是分割前后两部分的
4.左边:表示的是lambda表达式的参数列表(接口中,定义的抽象方法的参数)
5.右边:表示的是方法的方法体,lambda体
语法格式的书写
1.没有参数,也没有返回值
左面的小括号不能省,右边的大括号可以省略也可以不用省
2.有一个参数,没有返回值
有多个参数,没有返回值
左边的括号 可省可不省,右边的大括号可以省也可以不用省
3.接口中需要重写的方法内容有很多,需要给多句话的加上大括号
注意事项:如果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.作用
把已经实现的当做一个数据,作为一个引用,赋值给某个函数式接口的引用,可以把这个引用当做方法的返回值,也可以作为一个实现类对象
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的详细内容。
其它类似信息

推荐信息