本文是针对java8做的入门摘要笔录,详细分析可参见如下原文。

原文地址

http://www.javacodegeeks.com/2013/02/java-8-from-permgen-to-metaspace.html

http://ifeve.com/java-8-features-tutorial/

http://ifeve.com/java-permgen-removed/

http://blog.csdn.net/ioriogami/article/details/12782141

一、JVM特性

  Permanence Generation 永久移除,参数-XX:PermSize和-XX:MaxPermSize也被移除,取而代之的是Metaspace

  PermGen中类的元数据信息在每次FullGC的时候可能会被收集,但成绩很难令人满意。而且应该为PermGen分配多大的空间很难确定,因为PermSize的大小依赖于很多因素,比如JVM加载的class的总数,常量池的大小,方法的大小等,同时伴随性能问题。

  Metaspace,本地内存,类的元数据(metadata)保存于此,string常量移动到堆中。默认情况下,class metadata的分配仅受限于可用的native memory总量。由于类的元数据可以在本地内存(native memory)之外分配,所以其最大可利用空间是整个系统内存的可用空间。这样,你将不再会遇到OOM错误,溢出的内存会涌入到交换空间。最终用户可以为类元数据指定最大可利用的本地内存空间,JVM也可以增加本地内存空间来满足类元数据信息的存储。

  注:永久代的移除并不意味者类加载器泄露的问题就没有了。因此,你仍然需要监控你的消费和计划,因为内存泄露会耗尽整个本地内存,导致内存交换(swapping),这样只会变得更糟。

二、Lambda表达式

λ表达式的目标类型是“函数接口(functional interface)”

相当于内部类

//java7
public interface Runnable {
public abstract void run();
}
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("test");
}
}).start();
//java8
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
new Thread(() -> {
System.out.println("test");
}).start();
@FunctionalInterface
public interface MyInterface {
// 只能声明一个抽象方法
int add(int a, int b);
}
//p1,p2入参
//{}中相当于对接口add的实现
MyInterface myInterface = (p1,p2) -> {
int t = p1 + p2;
return t;
};
System.out.println(myInterface.add(1,2));

集合

List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//第一种写法
// o为入参,可简写去掉小括号,大括号{}是针对接口Consumer中accept方法的实现
list.forEach((o) -> {
System.out.println(o);
});
//第二种写法
Consumer consumer = o ->{
System.out.println(o);
};
list.forEach(consumer); //Consumer源码
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
// 其他方法略...
}

总结:

λ表达式只是为你节省了几行代码。但将λ表达式引入Java的动机并不仅仅为此。Java8有一个短期目标和一个长期目标。短期目标是:配合“集合类批处理操作”的内部迭代和并行处理(下面将要讲到);长期目标是将Java向函数式编程语言这个方向引导(并不是要完全变成一门函数式编程语言,只是让它有更多的函数式编程语言的特性),也正是由于这个原因,Oracle并没有简单地使用内部类去实现λ表达式,而是使用了一种更动态、更灵活、易于将来扩展和改变的策略(invokedynamic)。

三、接口

接口声明里可以有方法实现了,叫做默认方法( Default method)。

由于Collection库需要为批处理操作添加新的方法,如forEach(),stream()等,但是不能修改现有的Collection接口——如果那样做的话所有的实现类都要进行修改,包括很多客户自制的实现类。所以只好使用这种妥协的办法。

四、Stream

List list1 = new ArrayList<>();
list1.add();
list1.add();
list1.add();
list1.stream().filter(a->(Integer) a == ).forEach(b->System.out.println(b));

五、Optional

Optional< String > temp1 = Optional.ofNullable( null );
System.out.println(temp1.orElseGet( () -> "为空" ) );
Optional< String > temp2 = Optional.of( "test");
System.out.println(temp2.orElseGet( () -> "为空" ) );

六、Nashorn javascript引擎

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName( "JavaScript" ); System.out.println( engine.getClass().getName() );
System.out.println( "Result:" + engine.eval( "function f() { return 1; }; f() + 1;" ) );

七、parallelXXX并行

long[] arrayOfLong = new long [ 200 ];
Arrays.parallelSetAll( arrayOfLong, index -> ThreadLocalRandom.current().nextInt( 1000000 ) );
Arrays.stream( arrayOfLong ).limit( 10 ).forEach( i -> System.out.print( i + " " ) );
System.out.println();
Arrays.parallelSort( arrayOfLong );
Arrays.stream( arrayOfLong ).limit( 10 ).forEach( i -> System.out.print( i + " " ) );

八、其他(类型推断、注解扩展、反射方法参数、日期API、分析工具(jdeps、jjs))

java8新特性-入门摘要的更多相关文章

  1. java8 新特性入门 stream/lambda

    Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (b ...

  2. java8新特性全面解析

    在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...

  3. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  4. Java8 新特性之Lambda表达式

    1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...

  5. Java8新特性

    Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...

  6. Java系列 - 用Java8新特性进行Java开发太爽了

    本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...

  7. Java8 新特性之Stream----java.util.stream

    这个包主要提供元素的streams函数操作,比如对collections的map,reduce. 例如: int sum = widgets.stream() .filter(b -> b.ge ...

  8. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

  9. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

随机推荐

  1. 在“开始”菜单中的“运行”一栏输入特定命令打开windows程序

    winver 检查Windows版本   wmimgmt.msc 打开Windows管理体系结构(wmi)   wupdmgr Windows更新程序   wscript Windows脚本宿主设置 ...

  2. jquery文件上传控件 WebUploader

    WebUploader是百度开源的一个文件上传组件,因为其操作简洁大方,就在项目中使用了,记录一下. 效果是这样子:  这个样子是默认的效果.  这个是选择上传的图片,可以批量,选择后可以删除和添加更 ...

  3. struts2-core-2.3.20.jar

    核心配置位于该jar struts-default.xml struts-2.3.dtd <?xml version="1.0" encoding="UTF-8&q ...

  4. Structure From Motion(二维运动图像中的三维重建)

    SfM(Structure from Motion)简介 Structure from motion (SfM) is a photogrammetric range imaging techniqu ...

  5. 基于SketchUp和Unity3D的虚拟场景漫游和场景互动

    这是上学期的一次课程作业,难度不高但是也一并记录下来,偷懒地拿课程报告改改发上来. 课程要求:使用sketchUp建模,在Unity3D中实现场景漫游和场景互动. 知识点:建模.官方第一人称控制器.网 ...

  6. 终结篇:RemoteWebDriver与Grid简介-----Selenium快速入门(十五)

    Selenium的基本使用,已经介绍得差不多了,今天来简单说说RemoteWebDriver与Grid,也是本系列的最后一篇. 还记得本系列第一章(Selenium简介与环境搭配)的配置中,提到我们下 ...

  7. .Net框架搭建:SQL Server EF MVC简单三层框架

    https://blog.csdn.net/pukuimin1226/article/details/52313656

  8. ORM到底是什么有何优缺点

    转载地址:http://www.cnblogs.com/wgbs25673578/p/5140482.html ORM的概念, ORM到底是什么 一.ORM简介         对象关系映射(Obje ...

  9. gridview获取选中行索引及当前行数据

    gridview获取选中行索引及当前行数据 一.非直接绑定数据: <!--前台传值--> <asp:TemplateField HeaderText="操作"&g ...

  10. Python面向对象(特殊成员)

    day25 __init__     类()自动执行     __del__     __call__     对象()  类()() 自动执行     __int__      int(对象)    ...