Java8 的一些新特性的学习理解

  近期在学习队列相关的一些知识,在学习过程中发现Iterable<T>接口中新增了两个新的方法,出于好奇,就想知道这是什么东东,干什么用的。俗话说:实践出真知,所以就有了以下反复的测试。

先看下新增的这两个方法:

1 default void forEach(Consumer<? super T> action) {
2     Objects.requireNonNull(action);
3     for (T t : this) {
4         action.accept(t);
5     }
6 }
1 default Spliterator<T> spliterator() {
2      return Spliterators.spliteratorUnknownSize(iterator(), 0);
3 }

都知道接口中是不能写实现方法的哈,但是它这却有了实现方法,忽然间觉得世界观都被颠覆了,其实呢这也是java8新增的一个特性,在接口方法中添加default关键字就可以直接在接口中写实现(这不是本文的重点,感兴趣的童鞋可以自行学习java8)。

下面正式开始测试<使用BlockingQueue测试>:

1 BlockingQueue<Integer> q = new ArrayBlockingQueue<Integer>(1024);
2 while(q.size()<10){
3     q.put(q.size()+1);
4 }
5 Spliterator<Integer> split = q.spliterator();
6 split.forEachRemaining(line->{System.out.println(line);});  //①7 System.out.println("-------------------------------------");8 split.forEachRemaining(line->{System.out.println(line);});  //②

以上输出结果为:

1
2
3
4
5
6
7
8
9
10
-------------------------------------

根据以上结果可以看出,②处并没有输出任何的数据。看下Spliterator提供的迭代类forEachRemaining,它是为了并行处理流而新增的一个迭代类,

源码:

1 default void forEachRemaining(Consumer<? super T> action) {
2       do { } while (tryAdvance(action));
3 }

tryAdvance方法则对下一个为处理的操作执行action并返回true, 如果没有下一个元素,返回false。

 1 public boolean tryAdvance(Consumer<? super T> action) {
 2       if (action == null) throw new NullPointerException();
 3        if (it == null) {
 4            it = collection.iterator();
 5            est = (long) collection.size();
 6        }
 7       if (it.hasNext()) {
 8           action.accept(it.next());
 9           return true;
10       }
11       return false;
12 }

根据上面的源码可以看出,action如果为空直接抛出异常。it为空时,it是遍历传入集合的Iterator对象。

所以在①处:调用了迭代调用了tryAdvance,执行完①之后,it已经指向了conllection的最后一项,而对于②处,传入的集合是同一个集合,对于it也已经指向了最后一项,所以返回了false,没有数据可输出。

trySplit:ArrayListSpliterator的trySplit采用二分法,将前一半数据返回, 如果数据太小不能分了,返回null。而ConcurrentLinkedQueue和ConcurrentLinkedDeque的相应的Spliterator处理稍微复杂一点, 第一次取一个,第二个取两个,不超过MAX_BATCH。

更多的功能还需要慢慢的学习。

时间: 2024-10-28 20:26:12

Java8 的一些新特性的学习理解的相关文章

Java8部分新特性的学习

Java8中的新特性 一.Lambda表达式 Lambda表达式可以理解为一种可传递的匿名函数:它没有名称,但又参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名:和匿名类类似的,它没有明确的名字 函数:Lambda函数不属于某个特定的类,但和方法一样都具有参数列表.函数主体.返回类型,还可以有抛出的异常列表 传递:Lambda表达式可以作为参数传递给方法或者存储在变量中. Lambda表达式的基本形式: (parameters)-> expression 或(paramete

个人对于Java8的一些新特性总结

目前Java8已经发布很多个版本了,对于Java8中的新特性虽然有各位大神进行jdk8的英文特性文档翻译,但都太官方化语言,对照几篇翻译本人对新特性文档做一下总结,以帮助我和各位不了解Java8新特性的Java工程师们对其进行了解,水平有限,有错误之处请各位不吝赐教. 接口的改善(接口的默认方法): 在Java8以前接口的作用主要是对实现接口的类进行规范的,在其中只能定义常量和抽象方法. Java8中允许我们去定义一个非抽象方法,这个方法是一个静态方法 ,用default关键字来定义这个默认方法

JAVA8 十大新特性详解

本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API “Java is still not dead—and people are starting to figure that out.” 本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字. 一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方

java8十大新特性浅谈

本文将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API "Java is still not dead-and people are starting to figure that out." 本文将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字. 一.接口的默认方法 Java 8允许我们给接口添加一个非抽

ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof

一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计思想,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中,每行代码都要用心去写,每一行代码都要力求使最简洁的 3:学习别人遇到问题是如何分析问题,解决问题的方法是什么 4:遇到新东西应该如何去学习:1:先研究要学习的东西作用是什么 ,有什么好处  2:如何使用:具体的语

Java 8新特性:学习如何使用Lambda表达式,一看必懂

我将分为两篇系列文章来描述了使用Java 8的新特性 - lambda表达式. 目录 介绍 我们为什么需要lambdas? Lambdas的语法 功能接口 方法参考 构造函数参考 可变范围 默认方法 结论 介绍 Java 8版本是当前java界流行最广的一个版本.它的主要改进是在面向对象的基础上增加了对函数式编程的支持.在本文中,我将展示lambda的基本语法,并阐释几种适用的上下文环境. 我们为什么需要lambdas? lambda表达式是一个可以传递的代码块,允许您稍后执行它,只执行一次或多

Java8 新特性 Lambda学习

import java.util.ArrayList;import java.util.Collections;import java.util.IntSummaryStatistics;import java.util.List;import java.util.stream.Collectors; public class TestLambda{        public static void main(String[] args)    {        List<Employee>

java8 十大新特性

这篇文章是对Java 8中即将到来的改进做一个面向开发者的综合性的总结,JDK的这一特性将会在2013年9月份发布. 在写这篇文章的时候,Java 8的开发工作仍然在紧张有序的进行中,语言特新和API仍然有可能改变,我会尽我最大的努力保持这份文档跟得到Java 8的改动. Java 8的预览版,也就是 “Project Lambda”,现在可以从java.net下载到. 我使用了IntelliJ的预览版做我的IDE,在我看来他是目前支持java 8特性最好的一个IDE,你可以从这里下载到. 由于

Java8的重要新特性

一.Lambda表达式 java8中Lambda表达式的书写方式: (参数) -> 表达式 (参数) -> 单行语句 (参数) -> { 语句 } 1.Lambda遍历List和Map package com.yanwu.www.demo; /** * @author Harvey */ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; pu