Java 8全面解析!不知道的来看看那!

标签: java 解析 知道 | 发表时间:2013-09-04 21:37 | 作者:u011746030
出处:http://blog.csdn.net

java8的面世惊动了不少业界人员,让我们一起来看看吧!

函数式接口

函数式接口是只定义了一个抽象方法的接口。Java 8引入了 FunctionalInterface注解来表明一个接口打算成为一个函数式接口。例如,java.lang.Runnable就是一个函数式接口。

@FunctionalInterface
public interface Runnable {
public abstract void run();
}

注意,不管FunctionalInterface注解是否存在,Java编译器都会将所有满足该定义的接口看作是函数式接口.....


改进接口

现在可以在接口中定义静态方法了。例如,java.util.Comparator接口中现在拥有一个静态的naturalOrder方法。

public static <T extends Comparable<? super T>> Comparator <T>naturalOrder() {
return (Comparator<T>) Cmparators.NaturalOrderComparator.INSTANCE;
}

还能够在接口中提供默认方法。通过该功能,程序员能够在不破坏已有的接口实现代码的前提下添加新方法。例如,java.lang.Iterable接口现在拥有一个默认的forEach方法。

public default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
   }
  }

注意,接口不能为Object类中的任何方法提供默认的实现....

Lambda

函数式接口的重要属性是:我们能够使用lambda实例化它们, Lambda表达式让你能够将函数作为方法参数,或者将代码作为数据对待。下面是Lambda的一些例子。输入在左边,代码在右边。输入类型能够被推断出来,同时是可选的.............

(int x, int y) ->{ return x + y; }
(x, y) -> x + y
x -> x * x
() -> x
x -> { System.out.println(x); }

下面是实例化Runnable函数式接口的一个例子.............

Runnable r = () ->{ System.out.println("Running!"); }

方法引用

方法引用是简洁的Lambda表达式,能够用于已经拥有名称的方法。下面是一些方法引用的例子,右边是同样效果的Lambda表达式。

String::valueOf x ->String.valueOf(x)
Object::toString x ->x.toString()
x::toString () ->x.toString()
ArrayList::new () -> new ArrayList<>()

与捕获相对的非捕获Lambda

如果使用Lambda表达式访问一个在Lambda语句体外定义的非静态变量或者对象,那么它会被说成是“捕获”。例如,下面的Lambda会访问变量x:

int x = 5;
return y -> x + y;

一个Lambda表达式仅能够访问final或者有效final封闭块中的局部变量和参数...............

java.util.function

新版本向 java.util.function包中添加了很多新的函数式接口。下面是一些例子:

  • Function<T, R>——将T作为输入,返回R作为输出
  • Predicate<T>——将T作为输入,返回一个布尔值作为输出
  • Consumer<T>——将T作为输入,不返回任何内容
  • Supplier<T>——没有输入,返回T
  • BinaryOperator<T>——将两个T作为输入,返回一个T作为输出

java.util.stream

新的 java.util.stream包提供了对值流进行函数式操作的类。从一个集合中获取流的一种常见方式是:

Stream<T> stream = collection.stream();

下面是一个来自于Javadocs包中的例子..........

intsumOfWeights = blocks.stream().filter(b ->b.getColor() == RED)
		.mapToInt(b ->b.getWeight())
		.sum();

在该例子中我们首先使用了一个块集合作为流的来源,然后在流上执行了filter-map-reduce操作获取红块重量的和。

流可以是无限的、有状态的,可以是顺序的,也可以是并行的。在使用流的时候,你首先需要从一些来源中获取一个流,执行一个或者多个中间操作,然后执行一个最终操作。中间操作包括filter、map、flatMap、peel、distinct、sorted、limit和substream。终止操作包括forEach、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst和findAny。 java.util.stream.Collectors是一个非常有用的实用类。该类实现了很多归约操作,例如将流转换成集合和聚合元素............

改进了泛型推断

这提升了Java编译器推断泛型和在泛型方法调用中减少显式类型参数的能力。在Java 7中,代码如下:

foo(Utility.<Type>bar());
Utility.<Type>foo().bar();

在Java 8中,改进后的参数和调用链推断让你能够按照下面的方式编写代码:

foo(Utility.bar());
Utility.foo().bar();

java.time

新的日期/时间API包含在 java.time包中。所有的类都是不可变且线程安全的。日期和时间类型包括Instant、LocalDate、LocalTime、LocalDateTime和ZonedDateTime。除了日期和时间之外,还有Duration和Period类型。另外,值类型包括Month、DayOfWeek、Year、 Month、YearMonth、MonthDay、OffsetTime和OffsetDateTime。这些新的日期/时间类大部分JDBC都支持。

新增集合API

接口可以拥有默认函数的能力让Java 8得以向集合API中添加大量的新方法。所有的接口都提供了默认的实现,而更加有效的实现则是被添加到了具体的类中。下面是新方法的列表:

  • Iterable.forEach(Consumer)
  • Iterator.forEachRemaining(Consumer)
  • Collection.removeIf(Predicate)
  • Collection.spliterator()
  • Collection.stream()
  • Collection.parallelStream()
  • List.sort(Comparator)
  • List.replaceAll(UnaryOperator)
  • Map.forEach(BiConsumer)
  • Map.replaceAll(BiFunction)
  • Map.putIfAbsent(K, V)
  • Map.remove(Object, Object)
  • Map.replace(K, V, V)
  • Map.replace(K, V)
  • Map.computeIfAbsent(K, Function)
  • Map.computeIfPresent(K, BiFunction)
  • Map.compute(K, BiFunction)
  • Map.merge(K, V, BiFunction)
  • Map.getOrDefault(Object, V)

新增并发API

Java 8还向并发API中添加了一些新内容,我们将会在此简要介绍其中的一部分。ForkJoinPool.commonPool()是处理所有并行流操作的结构。没有明确提交到某个特定池中的所有ForkJoinTask都将会使用通用池。ConcurrentHashMap已经被完全重写。StampedLock是一个新的锁实现,它可以作为ReentrantReadWriteLock的一个备选方案。CompletableFuture是Future接口的一个实现,它为异步任务的执行和链接提供了方法.......

新增IO/NIO API

在Java 8中有一些新的IO/NIO方法,我们能够使用它们从文件或者输入流中获取java.util.stream.Stream。

  • BufferedReader.lines()
  • Files.list(Path)
  • Files.walk(Path, int, FileVisitOption...)
  • Files.walk(Path, FileVisitOption...)
  • Files.find(Path, int, BiPredicate, FileVisitOption...)
  • Files.lines(Path, Charset)
  • DirectoryStream.stream()

这里面有一个新的UncheckedIOException,它是一个继承了RuntimetimeException的IOException。还有一个CloseableStream,它是一个能够并且应该被关闭的流...........

反射和注解的变化

通过 类型注解,我们能够在更多的地方使用注解,例如像List<@Nullable String>这样的泛型参数中。这增强了通过静态分析工具发现错误的能力,它将增强并重定义Java内置的类型系统...........

Nashorn JavaScript引擎

Nashorn是一个集成到JDK中的新的、轻量级、高性能的JavaScript实现。Nashorn是Rhino的继任者,它提升了性能和内存使用情况。它将会支持javax.script API,但是它并不会支持DOM/CSS,也不会包含浏览器插件API........

java.lang、java.util等其他地方的新增功能

Java 8还向很多其他的包中添加了大量其他的功能,在本文中我们并没有提及。下面是一些值得注意的内容。可以使用ThreadLocal.withInitial(Supplier)更加简洁的声明本地线程变量。长期未兑现的StringJoiner和String.join(...)现在已经是Java 8的一部分了。比较器提供了一些新的方法能够用于链接和基于域的比较。默认的字符串池映射大小更大了,大约在25—50K。 迅龙提供

作者:u011746030 发表于2013-9-4 13:37:39 原文链接
阅读:88 评论:0 查看评论

相关 [java 解析 知道] 推荐:

Java 8全面解析!不知道的来看看那!

- - CSDN博客互联网推荐文章
java8的面世惊动了不少业界人员,让我们一起来看看吧. 函数式接口是只定义了一个抽象方法的接口. Java 8引入了 FunctionalInterface注解来表明一个接口打算成为一个函数式接口. 例如,java.lang.Runnable就是一个函数式接口. 注意,不管FunctionalInterface注解是否存在,Java编译器都会将所有满足该定义的接口看作是函数式接口......

java解析APK

- - Linux - 操作系统 - ITeye博客
1、结合安卓提供apktool工具,用java执行cmd解析命令获取apk信息. 2、利用相关jar包里的集成方法解析apk. 这里只给出第二种方法,因为第一种方法在linux服务器下会出现不在控制范围之内的结果. // 将解压文件对象转列举对象. // 获得名为AndroidManifest.xml的文件.

Java VCF 格式解析

- - ITeye博客
  Java VCF 格式解析. vcf可以用记事本打开,格式如下:. String name = "张三";. //将字符串转换成utf-8 quoted-printable 格式. //将字符串utf-8 quoted-printable 格式 转换成正常格式. //将图片转换成base64格式字符.

java解析xml数据---sax解析器

- - ITeye博客
下面是handler解析数据的方法. private HashMap map = null;// 存储单个解析的完整对象. private List> list = null;// 存储全部的解析对象. private String currentTag = null; // 正在解析的元素的标签.

Java你不知道的那些事儿—Java隐藏特性(上)

- - Java - 编程语言 - ITeye博客
每种语言都很强大,不管你是像我一样的初学者还是有过N年项目经验的大神,总会有你不知道的东西. 就其语言本身而言,比如Java,也许你用Java开发 了好几年,对其可以说是烂熟于心,但你能保证Java所有的用法你都知道吗. 今天没事就来整理下Java中有哪些隐藏的特性呢. 一、双括号初始化语法( DoubleBraceInitialization)(这里指的是大括号{}).

android 或者java SAX解析XML

- - ITeye博客
本实例解析xml使用的是继承DefaultHandler类,此类就是java中封装好的xml解析器类,下面看代码详细说明:. 第一步:首先说明下xml文件,Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode.

java中多种方式解析xml

- - Java - 编程语言 - ITeye博客
DOM的全称是Document Object Model,也即文档对象模型. 在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作. 通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制.

你应当知道的7个Java工具

- - ImportNew
Alex Zhitnitsky告诉我们这7个辅助工具的主要功能特点,这些工具每个java程序员都应该了解一下. 这篇文章最初发表在takipi的博客–Java与Scala异常分析和性能监控.. 在准备进行锁和负载测试之前,应该对一些最新的最具创新性的工具有一个快速了解. 为了防止你错过这些信息,rebellabs最近公布了对Java工具和技术全景的一个全球性调查 结果.

java日志,需要知道的几件事

- - Java - 编程语言 - ITeye博客
java日志,需要知道的几件事. 如果对于commons-loging 、log4j 、slf4j 、LogBack 等都已经非常清楚了,可以忽略本文. 几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对这块有更深刻理解的同学,也贡献出自己的知识和见解.

Java程序员应该知道的10个调试技巧

- - 博客 - 伯乐在线
摘要:调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷. 对于Java 程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序. 本文介绍了Java程序员必知的10个调试技巧,保证让你受益匪浅. 调试可以帮助识别和解决应用程序缺陷,在本文中,作者将使用大家常用的的开发工具Eclipse来调试Java应用程序.