Madao No More

你的努力程度之低,根本轮不到拼天赋.


  • 首页

  • 人文书籍

  • 日记

  • 面试问题

  • Linux

  • 编程语言

  • 服务器应用

  • 各种工具

  • 工作中的问题

  • 归档

  • 关于

  • 搜索
close

9c_Stream流

时间: 2020-11-18   |   分类: 编程语言     |   阅读: 1576 字 ~4分钟
  • 1. Stream流
    • 1.1. 生成流
    • 1.2. 中间操作
    • 1.3. 总结操作
    • 1.4. 收集操作

1. Stream流

感觉很像Linux里面awk,grep这种

思想

  1. 生成流:list,通过数据源生成流
  2. 中间操作:filter,多个中间操作,打开流,对数据进行操作并返回一个新的流交给下一个操作
  3. 终结操作:forEach,该操作结束后,流终止
  • 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流,过滤姓张,过滤长度为3,逐一打印
  • Stream流把真正的函数式编程风格引入到Java中

1.1. 生成流

生成Stream流的方式

  • Collection体系集合:使用默认方法stream()生成流, default Stream< E> stream()
  • Map体系集合:把Map转成Set集合,间接的生成流
  • 数组:通过Stream接口的静态方法of(T… values)生成流
    List<String> list = new ArrayList<String>();
    Stream<String> listStream = list.stream();

    Set<String> set = new HashSet<String>();
    Stream<String> setStream = set.stream();

    //Map体系的集合间接的生成流
    Map<String,Integer> map = new HashMap<String, Integer>();
    Stream<String> keyStream = map.keySet().stream();
    Stream<Integer> valueStream = map.values().stream();
    Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

    //数组可以通过Stream接口的静态方法of(T... values)生成流
    String[] strArray = {"hello","world","java"};
    Stream<String> strArrayStream = Stream.of(strArray);
    Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");
    Stream<Integer> intStream = Stream.of(10, 20, 30);

1.2. 中间操作

方法名 说明
Stream< T> filter(Predicate predicate) 用于对流中的数据进行过滤
Stream< T> limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据
Stream< T> skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流
static < T> Stream< T> concat(Stream a, Stream b) 合并a和b两个流为一个流
Stream< T> distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流
Stream< T> sorted() 返回由此流的元素组成的流,根据自然顺序排序
Stream< T> sorted(Comparator comparator) 返回由该流的元素组成的流,根据提供的Comparator进行排序
< R> Stream< R> map(Function mapper) 返回由给定函数应用于此流的元素的结果组成的流
IntStream mapToInt(ToIntFunction mapper) 返回一个IntStream其中包含将给定函数应用于此流的元素的结果
public class Test {
  public static void main(String[] args) {
    //创建一个集合,存储多个字符串元素
    ArrayList<String> list = new ArrayList<String>();
    list.add("林青霞");
    list.add("张曼玉");
    list.add("王祖贤");
    list.add("柳岩");
    list.add("张敏");
    list.add("张无忌");
    list.stream().
      filter(s -> s.startsWith("张")).limit(2).    //limit2 就剩下,张曼玉和张敏了.
      //  filter(s -> s.length() == 3).forEach(System.out::println);
      skip(1).forEach(System.out::println);         //skip跳过第一个.

    Stream s1=list.stream().limit(3);
    Stream s2=list.stream().skip(2);
    int count=Stream.concat(s1,s2).distinct().count();//统计个数
    System.out.println(count);

    System.out.println("----");
    list.stream().
//        sorted().
        sorted((s3, s4) ->{
          int num1= s3.length()-s4.length();
          int num2= num==0?s3.compareTo(s4):num;
          return num2;    //长度相同则,自然排序
        }).//按照长度
        forEach(System.out::println);

    ArrayList<String> list = new ArrayList<String>();
    list.add("10");
    list.add("20");
    list.add("30");
    list.add("40");
    list.add("50");
    list.add("60");

    list.stream().map(Integer::parseInt).forEach(System.out::println);
    int sum = list.stream().mapToInt(Integer::parseInt).sum();
    System.out.println(sum);
  }
}

1.3. 总结操作

方法名 说明
void forEach(Consumer action) 对此流的每个元素执行操作
long count() 返回此流中的元素数

1.4. 收集操作

对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中.

R collect(Collector collector): 把结果收集到集合中

工具类Collectors提供了具体的收集方式

方法名 说明
public static < T> Collector toList() 把元素收集到List集合中
public static < T> Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中
public class Test {
  public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("林青霞");
    list.add("张曼玉");
    list.add("王祖贤");
    list.add("柳岩");

    Stream<String> listStream = list.stream().filter(s -> s.length() >= 3);
    List<String> names = listStream.collect(Collectors.toList());
    for (String name : names) {
      System.out.println(name);
    }
    //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
    String[] strArray = {"林青霞,30", "张曼玉,35", "王祖贤,33", "柳岩,25"};
    //需求5:得到字符串中年龄数据大于28的流
    Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
    //需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
    Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
  }
}
#编程语言 - Java书籍 - 黑马Java#
9b_函数式接口
10a_类加载器概念深入
Madao

Madao

人的一切痛苦,本质上都是对自己无能的愤怒.

453 日志
10 分类
69 标签
GitHub E-mail
© 2009 - 2020 Madao No More
Powered by - Hugo v0.79.1
Theme by - NexT
0%