java8 Stream

零、功能接口 @FunctionInterface

  ①接口中只有一个抽象想法java

  ②Object类中方法编程

  ③静态方法api

 

1、Stream

含义: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做用是将对象转化为其余类型对象

 

stream()使用详解:

一、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"}]

 

 

2、方法引用

含义:方法引用是用来直接访问类或者实例的已存在的方法或者构造方法,方法引用是一个lambda表达式,其方法引用的操做符是双冒号::

 方法引用类型:  

类型  示例
引用静态方法 ContainingClass::staticMethodName
引用某个对象的实例方法 containingObject::instanceMethodName
引用某个类型的任意对象的实例方法 ContainingType::methodName
引用构造方法 ClassName::new

   

 

 

 

 

 

2.1引用静态方法:

组成语法: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"}
View Code

 

2.2引用某个对象的实例方法

 

 

 

 

 

 

 

 

 

 

参考:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/  

相关文章
相关标签/搜索