欢迎您光临本小站。希望您在这里可以找到自己想要的信息。。。

java8学习笔记总结(六)

java water 2657℃ 0评论

API

JDK8新增加的许多功能中,有两个极为重要,分别是lambda表达式和流api

Api的关键一点在于能执行非常复杂的查找、过滤和映射数据等操作。

Api提供了一种高效且易于使用的处理数据的方式

要想完整地理解和使用流API,需要牢固地掌握泛型和lambda表达式。此外,还需要了解并行执行的基本概念,并知道如何使用集合框架

 

API中“流”的概念:流是数据的渠道。流代表了一个对象序列。流操作数据源,如数组或集合。流本身不存储数据,而只是移动数据。在移动过程中可能会对数据执行过滤、排序或其他操作。流操作本身不修改数据源。对流排序不会修改数据源的顺序,对流排序会创建一个新流,其中包含排序后的结果。本章中使用“流”指的是这里描述的某个流类型的对象

 

流接口:interface BaseStream<T,  S extends BaseStream<T, S>>

T指定流中元素的类型,S指定扩展了BaseStream的流的类型。BaseStream扩展了AutoCloseable接口

 

BaseStream接口派生了几个流接口,其中最具一般性的是stream接口

Interface Stream<T>

 

接口中许多方法都被标注为“终端操作”或“中间操作”。二者的区别非常重要。终端操作会消费流。这种操作用于产生结果,例如找出流中最小的值,或执行某种操作,比如forEach()方法。一个流被消费以后,就不能被重用。中间操作会产生另一个流。因此,中间操作可以用来创建执行一系列动作的管道。另外一点:中间操作不是立即发生的。相反,当在中间操作创建的新流上执行完终端操作后,中间操作指定的操作才会发生。这种机制称为延迟行为,所以称中间操作为延迟发生的。延迟行为让流API能够更加高效地执行。

 

流的另外一个关键点是,一些中间操作是无状态的(过滤),另外一些是有状态的(排序)

Stream操作的是对象引用,所有不能直接操作基本类型

为了处理基本类型流,定义了DoubleStreamIntStreamLongStream

 

如何获得流

获得流的方式有多种。可能最常见的是获得集合流。从JDK8开始,Collection接口已被扩展,包含两个可以获得集合流的方法。第一个是stream() 顺序流

第二个是parallelStream()并行流

还有另外一些方式可以获得流。例如,许多流操作会返回新流,而且通过对BufferedReader调用lines方法,可以获得I/O源的流。

 

缩减操作:特例缩减操作如(min()max()count()

API泛化了这种概念,提供了reduce()方法。通过使用reduce()方法,可以基于任意条件,从流中返回一个值,根据定义,所有缩减操作都是终端操作

 

T apply(T val, T val2)

在用到reduce()中时,val将包含前一个结果,val2将包含下一个元素,需要理解的是,累加器操作必须满足一下三个约束:无状态、不干预、结合性

 

使用并行流

流库提供的好处之一是能够轻松可靠地并行执行一些操作

获得并行流的一种方法是使用Collection定义的parallelStream()方法、另一种方法是对顺序流调用parallel()方法

 

Optional<Integer> productObj = myList.parallelStream().read((a,b) – > a*b)

使用并行流时,可能会发现下面这个版本的reduce()方法十分有用。该版本可以指定如何合并部分结果

<U> U reduce(U identityVal, BiFunction<U, ? super T,  U> accumulator, BinaryOperator<U> combiner)

S sequential() 一般来说,可以根据需要,使流在并行流和顺序流之间切换

 

映射:将一个流的元素映射到另一个流很有帮助

在创建数据库风格的查询时,这种过滤操作十分常见。随着使用流api的经验增多,您将发现,这种链式操作可以用来在数据流上创建复杂的查询、合并和选择操作

 

API还提供了支持flat map的方法,是为了处理原始流中的每个元素映射到结果流中的多个元素的情况

 

收集:可以从集合中获得流,并且这种做法十分常见。但,有时候需要执行反操作:从流中获得集合。为了执行这种操作,流API提供了collect()方法

<R, A> R collect(Collector<? Super T, A, R> collectorFunc)

Collector接口是在java.util.stream包中声明的

Interface Collector<T, A, R>

Collectors类提供的两个预定义收集器。toList()toSet()

 

<R> R collect<Supplier<R> target, BiConsumer<R,  ? supder T> accumulator,

BiConsumer<R, R> combiner>

 

LinkedList<NamePhone> npList = nameAndPhone.collect(

()-> new LinkedList<>,

(list, element)->list.add(element),

(listA, listB) ->listA.addAll(listB));

 

并不总是需要为collect()方法的参数指定一个lambda表达式。通常,方法和或构造函数引用就足够了

HashSet<NamePhone> npSet = nameAndPhone.collect(

HashMap::new,

HashMap::add,

HashMap::addAll);

用流API的术语来说,collect()方法执行所谓的可变缩减操作。这是因为,这个缩减操作的结果是一个可变的存储对象

 

迭代器和流

API支持两类迭代器。一类是传统的Iterator,另以来是JDK8新增的Spliterator(涉及并行处理时更加方便)

Spliterator经常使用的三个方法

tryAdvance(Consumer<? Super T> action)

for EachRemaining(Consumer<? Supder T> action)

Spliterator<T> trySplit()

判断流中的一个或多个元素是否满足指定谓词,可使用allMatch(), anyMatch()noneMatch()

获取元素数量count()

获得只包含独特元素的流distinct()

创建包含指定元素集合的流,可使用of()

APIjava中增加的一个强大特性,很可能会逐渐增强,甚至包含更多功能,因此建议每隔一段时间就浏览其API文档

 

Java

字符串处理,StringStringBuilder(JDK 5引入的,以增强java的字符串处理能力。不是同步的,非线程安全)StringBuffer(是线程安全的)

 

探究java.lang

Java.lang自动被导入到所有程序中。

ThreadGroup线程组为管理一组线程提供了一种便利的方式,可以将一组线程作为一个单位进行管理

ThreadLocal 用于创建线程局部变量,每个线程将具有线程局部变量的一个副本

 

集合框架

J2SE 1.2版本就一部分集合比如:DictionaryVectorStackProperties

 

算法是集合机制的另外一个总要部分。算法操作集合,并且被定义为Collections类中的静态方法。因此,所有集合都可以使用它们。每个集合类都不需要实现特定于自己的版本,算法为操作集合提同类标准方式

 

与集合框架密切相关的另一个内容是Iterator接口

 

除了集合外,框架还定义了一些映射接口和类。映射存储键/值对。尽管映射是集合框架的组成部分,但从严格意义上讲,它们不是集合。不过可以获取它们的集合视图

 

集合机制改造了java.util定义的某些原始类,从而使它们能集成到新系统,尽管集合替换了某些原始使用工具类的架构,只是为了做某些事情提供更好的方式,不会造成任何类过时

 

JDK5增加泛型、自动装箱/拆箱以及for-each风格的for循环

泛型添加了集合一直缺失的:类型安全性。泛型之前,所有集合都存储Object引用,使用泛型,可以明确的表明将要存储的数据类型。

 

映射它们没有实现Iterable接口。

 

早期版本的java.util包没有包含集合框架,而是定义了几个类和一个接口,用来提供存储对象的专业方法,当添加集合时(有J2SE 1.2)添加,对几个原始类进行了重新设计以支持集合接口。现代集合的功能与遗留类的功能相同时,通常希望使用更新一些的集合类。仍然支持遗留类是因为有些代码仍然需要使用它们

 

另外一点:本章介绍的所有现代集合类都不是同步的,但是遗留类都是同步的

 

Hashtable键和值都不能是null

 

Vector实现了动态数组,与ArrayList类似

PropertiesHashtable的子类,用于保存值的列表。在列表中,键是String类型,值也是String类型。

Properties对象中保存的信息,可以使用store()load()方法很容易地存储到磁盘中以及从磁盘加载

转载请注明:学时网 » java8学习笔记总结(六)

喜欢 (0)or分享 (0)

您必须 登录 才能发表评论!