Stream 流

Stream 流

  • Stream流是一种流式接口,是jdk8出现的特性。
  • Stream流对于集合做聚合操作。
  • Stream流中的接口都是函数是接口,都可以使用lambda表达式。

获取流的方式

  • 集合.Stream
import java.util.Arrays;
import java.util.ListIterator;
import java.util.stream.Stream;

public static void main(String[] args) {
    // 创建一个list
    List
<Integer> list = Arraya.asList(1, 2, 3, 4, 5);
    //获取流的方式一

    Stream
<Integer> stream = list.stream();

    List
<Integer> list1 = Arrays.asList(1, 4, 5, 6, 7);
    List
<Integer> list2 = Arrays.asList(6, 3, 4, 6, 6);
    List
<Integer> list3 = Arrays.asList(88, 44, 55, 6, 7);
    Stream
<Integer> stream1 = list1.stream();
    Stream
<Integer> stream2 = list2.stream();
    Stream
<Integer> stream3 = list3.stream();
}
  • 合并流Stream.concat
public static void main(String[] args) {
    // 获取流的方式二  
    Stream
<Integer> concat = Stream.concat(stream1, stream2);
    Stream
<Integer> concat1 = Stream.concat(concat, stream3);

    Stream
<Integer> concat2 = Stream.concat(Stream.concat(stream1, stream2), stream3);
}

常用方法

  • distinct() 去重,把流中重复的元素去重
  • sorted() 排序
  • limit(n) 获取前n个元素
  • collect() 把流转换成对应的集合
  • flatMap() 合并流
  • filter() 过滤
  • map()
  • peek() 对集合中的每一个对象进行处理

案例一 :对指定的集合数据进行去重,然后降序排列,并获取前3个最大值

方式一:

import java.util.ArrayList;
import java.util.Collection;

public static void main(String[] args) {
    List
<Integer> list = new ArrayList<>();
    //向集合中添加数据
    Collection.addAll(list, 1, 3, 5, 1, 6, 8, 9, 3, 2, 6, 7, 5, 11, 66, 4, 88, 7);

    //将流转换为集合
    List
<Integer> collect = list.stream().distinct().sorted(Comparator.reverseOrder()).limit(3).collect(Collectors.toList());
    System.out.println(collect);
}

方法二:

import java.util.Collections;
import java.util.Comparator;
import java.util.stream.Stream;

public static void main(String[] args) {
    List
<Integer> list = new ArrayList<>();
    // 向集合中添加数据
    Collections.addAll(list, 1, 3, 5, 1, 6, 8, 9, 3, 2, 6, 7, 5, 11, 66, 4, 88, 7);
}

public static void method() {
    //获取流
    Stream
<Integer> stream = list.stream();
    //去重
    Stream
<Integer> stream1 = stream.distinct();
    //降序
//  Stream
<Integer> stream2 = stream1.sorted(new Comparator<Integer>() {
//    @Override
//    public int compare(Integer o1, Integer o2) {
//      return o2 - o1;
//    }
//  });
    //降序 lambda
    Stream
<Integer> stream2 = stream1.sorted((o1, o2) -> o2 - o1);
    //获取前三个值
    List
<Integer> collect = stream3.collect(Collections.singletonList());
    System.out.println(collect);

}

案例二:统计多个集合中最大最小值,平均值,和。排序去重后获取结果。

import java.util.Comparator;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.function.ToIntFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public static void main(String[] args) {
    //定义三个集合
    List
<Integer> list1 = Arrays.asList(1, 4, 5, 6, 7, 2);
    List
<Integer> list2 = Arrays.asList(13, 2, 55, 6, 44, 7, 88, 9);
    List
<Integer> list3 = Arrays.asList(11, 2, 33, 44, 46, 56);

    //合并到一个stream流中 

    //方式一 使用 Stream.concat 递归地合并多个 Stream
    Stream
<Integer> stream = Stream.concat(list1.stream(), list2.stream(), list3.stream());

    //方式二 使用匿名内部类与flatMap()合并多个流  
    Stream
<Object> stream = Stream.of(list1, list2, list3).flapMap(new Function<List<Integer>, Stream<?>>() {
        @Override
        public Stream<?> apply(List<Integer> integers) {
            return integers.stream();
        }
    });

    //方式三 使用 flatMap 和 Lambda 表达式合并多个流
    Stream
<Integer> stream = Stream.of(list1, list2, list3).flatMap(integers -> integers.stream());

    //方式四 使用 flatMap 和方法引用合并多个流
    Stream
<Integer> stream = Stream.of(list1, list2, list3).flatMap(List::stream);

    // 合并多个列表,去重,按降序排序,收集结果
    List
<Integer> collect = Stream.of(list1, list2, list3).flatMap(List::stream).distinct().sorted((Comparator.reverseOrder()).collect(Collectors.toList()));
    System.out.println(collect);

    // 计算统计信息

    //使用匿名内部类计算统计信息
    IntSummaryStatistics intSummaryStatistics = collect.stream().mapToInt(new ToIntFunction
<Integer>() {
        @Override
        public int applyAsInt(Integer value) {
            return value.intValue();
        }
    }).summaryStatistics();
    //使用Lambda表达式
    collect.stream().mapToInt(v -> v.intValue());

    //使用方法引用计算统计信息
    IntSummaryStatistics intSummaryStatistics1 = collect.stream().mapToInt(Integer::intValue).summaryStatistics();

    // 输出信息
    // 平均值
    System.out.println(intSummaryStatistics.getAverage());
    // 最大值
    System.out.println(intSummaryStatistics.getMax());
    // 最小值
    System.out.println(intSummaryStatistics.getMin());
    // 和
    System.out.println(intSummaryStatistics.getSum());
}

案例三:统计集合中名字带o的,分数score > 40的人,根据成绩进行降序排序,根据id进行升序排序

import java.util.ArrayList;
import java.util.Comparator;
import java.util.stream.Collectors;

class Person {
    public class Person {

        private int id;

        private String name;

        private int score;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getScore() {
            return score;
        }

        public void setScore(int score) {
            this.score = score;
        }

        public Person(int id, String name, int score) {
            this.id = id;
            this.name = name;
            this.score = score;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", score=" + score +
                    '}';
        }
    }
}

public static void main(String[] args) {

    // 统计集合中名字带o的,分数score > 40的人,根据成绩进行降序排序,根据id进行升序排序

    List
<Person> persons = Arrays.asList(
            new Person(1, "james", 8),
            new Person(3, "durant", 45),
            new Person(4, "curry", 40),
            new Person(5, "jordan", 81),
            new Person(2, "kobe", 81),
            new Person(6, "jokic", 90),
            new Person(7, "westbrook", 39)
    );

    // 返回false的数据就会被过滤掉
//        persons.stream().filter(new Predicate
<Person>() {
//            @Override
//            public boolean test(Person person) {
//                return person.getName().contains("o") && person.getScore() > 40;
//            }
//        });

    List
<Person> people = person.stream().filter(person -> person.getName().contains("o"))
            .filter(person.getScore() > 40)
            .sorted(Comparator(Person::getId))
            .collect(Collectors.toList());
    people.forEach(System.out::println);
}

public static void main(String[] args) {
    List
<Person> datalist = new ArrayList<>();

    // 传统方式 增强for循环
    for (Person person : persons) {
        if (person.getName().contains("o") && person.getScore() > 40) {
            datalist.add(person);
        }
    }

    //重写compare方法
//  datalist.sort(new Comparator
<Person>(){
//     @Override
//    public int compare(Person o1,Person o2){
//         return o2.getScore() - o1.getScore;
//     }
//  });

    //lambda表达式
//  datalist.sort((o1,o2)->o2.getScore()-o1.getScore());

    datalist.sort(Comparator.comparing(Person::getScore).reversed().thenComparing(Person::getId));
}

案例四:把集合中的名称全部转换成大写

public static void main(String[] args) {
    List
<Person> persons = Arrays.asList(
            new Person(1, "james", 8),
            new Person(3, "durant", 45),
            new Person(4, "curry", 40),
            new Person(5, "jordan", 81),
            new Person(2, "kobe", 81),
            new Person(6, "jokic", 90),
            new Person(7, "westbrook", 39)
    );
    // 传统方式
//        List
<Person> list = new ArrayList<>();
//        for (Person person : persons) {
//            person.setName(person.getName().toUpperCase());
//            list.add(person);
//        }
//        System.out.println(list);

    // 流式调用
    // map 对于集合中的每一个元素进行处理
    // 泛型一:apply方法的参数类型
    // 泛型二:返回值类型
//        List
<Person> collect = persons.stream().map(new Function<Person, Person>() {
//            @Override
//            public Person apply(Person person) {
//                person.setName(person.getName().toUpperCase());
//                return person;
//            }
//        }).collect(Collectors.toList());
    // lambda表达式
//        List
<Person> collect = persons.stream().
//                map(person -> new Person(person.getId(), person.getName().toUpperCase(), person.getScore())).
//                collect(Collectors.toList());
//        List
<Person> collect = persons.stream().map(person -> {
//            person.setName(person.getName().toUpperCase());
//            return person;
//        }).collect(Collectors.toList());
//        collect.forEach(System.out::println);

    // 求结果中名字带u的人
    List
<Person> personList = persons.stream().
            filter(person -> person.getName().contains("u")).
            map(person -> {
                person.setName(person.getName().toUpperCase());
                return person;
            }).collect(Collectors.toList());
    System.out.println(personList);

}

案例五:给每个人的分数都加10分

  public static void main(String[] args) {
    List
<Person> persons = Arrays.asList(
            new Person(1, "james", 8),
            new Person(3, "durant", 45),
            new Person(4, "curry", 40),
            new Person(5, "jordan", 81),
            new Person(2, "kobe", 81),
            new Person(6, "jokic", 90),
            new Person(7, "westbrook", 39)
    );

//        List
<Person> collect = persons.stream().
//                map(person -> {
//            person.setScore(per  son.getScore() + 10);
//            return person;
//        }).collect(Collectors.toList());
//        System.out.println(collect);

    // 匿名内部类
//        List
<Person> collect = persons.stream().peek(new Consumer<Person>() {
//            @Override
//            public void accept(Person person) {
//                person.setScore(person.getScore() + 10);
//            }
//        }).collect(Collectors.toList());

    // lambda表达式
    List
<Person> collect = persons.stream().peek(p -> p.setScore(p.getScore() + 10)).collect(Collectors.toList());
    System.out.println(collect);
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇