Java8流式编程

Java8流式编程

2019, Mar 21    

前言

在前天的时候,java12都出了,但是我还在用java6的陈旧的编码方式,需要改进到java8的流式编程,此文主要是用来记录流式编程的积累

java8 新特性

个人的主要理解

java真正的支持了函数式的编程,同时加入了streamApi来进行支持

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 Stream编程

总而言之,流式操作主要分为了中间操作和最终操作

Intermediate 操作

非最终操作,也就是中间操作

  • map (mapToInt, flatMap 等)
  • filter
  • distinct
  • sorted
  • peek
  • limit
  • skip
  • parallel
  • sequential
  • unordered

Terminal 操作

最终操作

  • forEach
  • forEachOrdered
  • toArray
  • reduce
  • collect
  • min
  • max
  • count
  • anyMatch
  • allMatch
  • noneMatch
  • findFirst
  • findAny
  • iterator

Short-circuiting 操作

短程巡回操作

  • anyMatch
  • allMatch
  • noneMatch
  • findFirst
  • findAny
  • limit

实操例子

将一个列表/数组进行处理进行转换

例子如下:

	Set<Integer> collect = projects
		.stream()
		.map(CustomProject::getId)
		.collect(Collectors.toSet());

代码翻译:

  • projects是CustomProject的一个List
  • 然后map()进行一个映射
  • 将其中的id属性去除,
  • collect()可以转换成另外的数据结构集合

filter过滤和forEach

例子如下:

    all.stream().filter(greyTask ->
            greyTask.getType() == GreyTaskType.PERSON
    ).forEach(greyTask1 -> {
        List<String> source = greyTask1.getSource();
        source.stream().filter(username -> username.startsWith("B-")).forEach(bUser -> {
            bUser = "B-" + 处理bUser的代码;
        });
        source.stream().filter(userId -> userId.startsWith("C-")).forEach(cUser -> {
            cUser = "C-" + 处理cUser的代码;
        });
        greyTask1.setSource(source);
    });

转换成map

例子如下:

	 List<Person> list = new ArrayList();  
	        list.add(new Person("1001", "小A"));  
	        list.add(new Person("1002", "小B"));  
	        list.add(new Person("1003", "小C"));
	//将list转换map
	Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));

但是有一点需要注意,就是Collectors中的tomap 方法,value值也是不允许重复的,如果想要转成HashMap的话,还是使用forEach比较方便

处理String类型的String

对List类型进行处理的时候,需要重新返回一个List,因为String都是final的

	 List<String> collectUserB = source.stream().filter(username -> username.startsWith("B-")).map(bUser -> {
            bUser = "B-" + userService.getPerson(bUser.replace("B-", "")).getDisplayName();
            return bUser;
        }).collect(Collectors.toList());