①接口中只有一个抽象想法java
②Object类中方法编程
③静态方法api
含义:Stream是对集合对象进行各类便利、高效聚合操做或者大批量数据操做。stream借助lambda表达式极大提升编程效率和程序可读性ide
构成:数据源——>数据转换——>执行操做获取想要结果。每次转换原有stream对象不变,返回一个新的stream对象函数
例:this
//实现将含有a、b、c三个元素的list转换为大写字母放入新的list中 List<String> strs=Arrays.asList("a","b","c"); //java8以前作法 List<String> before8=new ArrayList<String>(); for(String str:strs){ before8.add(str.toUpperCase()); } //java8以后作法 List<String> after8=strs.stream().map(String ::toUpperCase).collect(Collector.toList()); //map做用是将对象转化为其余类型对象
一、map():将input stream的每个元素映射成output stream的另外一个元素。--只是将原来元素作聚合等计算,但没有if条件判断spa
List<Integer> nums=Arrays.asList(1,2,3);
List<Integer> newNums=nums.stream().map(n->n*n).collect(Collectors.toList());
结果:[1,4,9]code
二、filter():过滤inputstream,将知足条件的元素生成outputstream ---存在if条件判断对象
List<Integer> nums=Arrays.asList(1,2,3,4,5,6);
List<Integer> newNums=nums.stream().filter(n->n%2==0).collect(Collectors.toList());
结果:[2, 4, 6]blog
三、forEach():对每一个inputstream元素执行->后表达式
public class TestJava8 { public static void main(String[] args) { List<Integer> nums=Arrays.asList(1,2,3,4,5,6); nums.stream().forEach(n->getn(n)); nums.stream().forEach(n->getn(n*8)); } private static String getn(int n) { System.out.println("-----------"+n); return n+"dd"; } } 结果: -----------1 -----------2 -----------3 -----------4 -----------5 -----------6 -----------8 -----------16 -----------24 -----------32 -----------40 -----------48
四、reduce():做用是把stream元素组合起来
reduce格式是:reduce(参考值,操做函数),参考值会参与到后边操做函数中;若是没有参考值则返回的Optional[]格式
常见:sum、min、max、concat 等方法
List<Integer> lists=Arrays.asList(-3,-7,-1,5,1); lists.stream().reduce(0,Integer::sum));//结果是0-3-7-1+5+1=-5 lists.stream().reduce(Integer::sum));//结果是Optional[-5] lists.stream().reduce(Integer::sum).get());//结果是-5 lists.stream().reduce(Integer::min).get());//结果是-7 同理还有max()方法 List<String> strs=Arrays.asList("Q","W","E"); strs.stream.reduce("",String::concat)); //结果是"QWE" strs.stream.reduce("A",String:concat));//结果是"AQWE"
五、limit/skip
limit(n):返回前n个元素
skip(n):去掉前n个元素
iterate():迭代,用于从函数生成流,通常用limit()或skip()对这种流加以限制
Stream.iterate(0, n->n+3).limit(10).skip(3).forEach(System.out::println);
结果:
9
12
15
18
21
24
27
六、Match匹配,stream有三个match方法
allMatch():Stream中所有元素都符合逻辑判断,则返回true
anyMatch():Stream中只要有一个元素都符合逻辑判断,则返回true
noneMatch():Stream中所有元素都不符合逻辑判断,则返回true
List<Staff> stuffs=Arrays.asList( new Staff("mkyong", 30), new Staff("jack", 27), new Staff("lawrence", 33), new Staff("lawrence", 22) ); System.out.println(stuffs.stream().allMatch(stuff->stuff.getAge()>28)); System.out.println(stuffs.stream().anyMatch(stuff->stuff.getAge()>28)); System.out.println(stuffs.stream().noneMatch(sutff->sutff.getAge()>28)); 结果: false true false
七、sort() 排序; distinct()找出不重复内容
lists.stream().filter(word -> word.length() > 0).
map(String::toLowerCase).
distinct().
sorted().
collect(Collectors.toList());
八、groupby/partitionby
List<Staff> stuffs=Arrays.asList( new Staff("mkyong", 30), new Staff("jack", 22), new Staff("lawrence", 33), new Staff("lawrence", 22) ); Map<Integer,List<Staff>> stfs=stuffs.stream().collect(Collectors.groupingBy(Staff::getAge)); //分组 for(Map.Entry<Integer, List<Staff>> entry:stfs.entrySet()) { System.out.println("key:"+entry.getKey()); System.out.println("value:"+JSON.toJSONString(entry.getValue())); } 结果: key:33 value:[{"age":33,"name":"lawrence"}] key:22 value:[{"age":22,"name":"jack"},{"age":22,"name":"lawrence"}] key:30 value:[{"age":30,"name":"mkyong"}]
含义:方法引用是用来直接访问类或者实例的已存在的方法或者构造方法,方法引用是一个lambda表达式,其方法引用的操做符是双冒号::
方法引用类型:
类型 | 示例 |
引用静态方法 | ContainingClass::staticMethodName |
引用某个对象的实例方法 | containingObject::instanceMethodName |
引用某个类型的任意对象的实例方法 | ContainingType::methodName |
引用构造方法 | ClassName::new |
组成语法:ClassName::statcimethodName
诸如:String::valueOf 等价s->String.valueOf(s)
Math::pow 等价于(x,y)->math.pow(x,y)
public class Person { private LocalDate birthday; private String name; public Person(String name,LocalDate birthday) { this.name=name; this.birthday=birthday; } public LocalDate getBirthday() { return birthday; } public String getName() { return name; } public void setBirthday(LocalDate birthday) { this.birthday = birthday; } static int compareByAge(Person p1,Person p2) { //尤为注意这里是静态方法,若是不是静态方法则不能被方法引用 return p1.birthday.compareTo(p2.birthday); } } public class ReferenceDemo { public static void main(String[] args) { List<Person> persons1=Arrays.asList(new Person("zhangSan",LocalDate.of(2000, 6, 6)), new Person("wangWu",LocalDate.of(1999, 9, 20)), new Person("hanMeiMei",LocalDate.of(2001, 6, 1)) ); List<Person> persons2=Arrays.asList(new Person("zhangSan",LocalDate.of(2000, 6, 6)), new Person("wangWu",LocalDate.of(1999, 9, 20)), new Person("hanMeiMei",LocalDate.of(2001, 6, 1)) ); //lambda表达式 List<Person> pp1=persons1.stream().sorted((p1,p2)->(p1.getBirthday().compareTo(p2.getBirthday()))).collect(Collectors.toList()); //方法引用 List<Person> pp2=persons2.stream().sorted(Person::compareByAge).collect(Collectors.toList()); pp1.forEach((p)->System.out.println(JSON.toJSONString(p))); System.out.println("------------------------"); pp2.forEach((p)->System.out.println(JSON.toJSONString(p))); } } 结果: {"birthday":"1999-09-20","name":"wangWu"} {"birthday":"2000-06-06","name":"zhangSan"} {"birthday":"2001-06-01","name":"hanMeiMei"} ------------------------ {"birthday":"1999-09-20","name":"wangWu"} {"birthday":"2000-06-06","name":"zhangSan"} {"birthday":"2001-06-01","name":"hanMeiMei"}
2.2引用某个对象的实例方法
参考:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/