简单了解JAVA8的新特性
JAVA8新特性会颠覆整个JAVA程序员的编程习惯
甚至如果您坚守JAVA7之前的编程习惯,今后你看比较年轻的程序员写的JAVA代码都会无法理解
所以为了保证不脱钩,我觉得有必要学习JAVA8的新特性,况且,这会极大得提高CPU效率和编码效率
我们来简单了解一下JAVA8的新特性
我觉得主要有两个比较重要的,一是Lambda表达式,二是集合类的stream操作
关于这两点,我写了几个小DEMO,附上注释,应该能够迅速掌握
如果大家好奇更多的JAVA8新特性,请自行阅读更加专业的知识,敏捷开发不求甚解是我的编程态度。
顺便说一句,JAVA8目前只有最新版eclipse MARs支持编译
即使您下载了JAVA8的JDK和JRE,myeclipse目前还不支持对JAVA8的编译
也就是说下面的代码会在myeclipse下面报错的。
package com.newflypig.test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; public class TestJava {
public static void main(String[] args) {
// java8 的新特性,lambda表达式,类似于匿名内部类
Thread testThread = new Thread(() -> {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("aa");
list.add("bb");
list.add("cc");
list.forEach(s -> {
System.out.println(s);
;
}); list.stream().filter(s -> s.length() == 2).forEach(s -> {
System.out.println(s);
});
}); System.out.println("======================================"); distinct("2", "3", "4", "5", "6", "7", "8", "9", "2", "3", "4", "5", "6", "7", "8", "9"); testThread.run();
} // 新特性,不定参数
private static void distinct(String... numbers) {
List<String> list = Arrays.asList(numbers);
List<Integer> listInt = list.stream()
.map(s -> Integer.parseInt(s)) // 将集合流中的元素一一映射为一个新的元素,并生成到新的输出流中
.filter(a -> isPrime(a)) // 过滤,lambda表达式
.distinct() // stream的高级方法,去除重复
.collect(Collectors.toList()); // 将整理好的输出流收集到新的listInt集合中
/**
* 你可能会觉得在这个例子里,List list被迭代了好多次,
* map,filter,distinct都分别是一次循环,效率会不好。
* 实际并非如此。这些返回另一个Stream的方法都是“lazy”的,而最后返回最终结果的collect方法则是“eager”的。
* 在遇到eager方法之前,lazy的方法不会执行。
*
* 当遇到eager方法时,前面的lazy方法才会被依次执行。
* 而且是管道贯通式执行。这意味着每一个元素依次通过这些管道。
* 例如有个元素“3”,首先它被map成整数型3;
* 然后通过filter,发现是素数,被保留下来;又通过distinct,
* 如果已经有一个3了,那么就直接丢弃,如果还没有则保留。这样,3个操作其实只经过了一次循环。
*
* 除collect外其它的eager操作还有forEach,toArray,reduce等
*/ listInt
.stream()
.forEach(i -> { // stream的forEach,类似于Collections.forEach
System.out.println(i);
}); int sum=listInt
.stream()
.reduce((isum,item)->isum+item)
.get();
int min=listInt
.stream()
.reduce((a,b)->a<b?a:b)
.get();
int max=listInt
.stream()
.reduce((a,b)->a>b?a:b)
.get();
/**
* reduce方法接受一个函数,这个函数有两个参数,
* 第一个参数是上次函数执行的返回值(也称为中间结果),
* 第二个参数是stream中的元素,这个函数把这两个值相加,
* 得到的和会被赋值给下次执行这个函数的第一个参数。
* 要注意的是:第一次执行的时候第一个参数的值是Stream的第一个元素, 第二个参数是Stream的第二个元素。
* 这个方法返回值类型是Optional,这是Java8防止出现NPE(NULL POINT ELEMENT)的一种可行方法,
* 这里就简单的认为是一个容器,其中可能会包含0个或者1个对象。
*/
System.out.println(sum+"\t"+min+"\t"+max);
} private static boolean isPrime(int a) {
boolean flag = true;
for (int i = 2; i <= a / 2; i++) {
if (a % i == 0) {
flag = false;
break;
}
}
return flag;
}
}
对于JAVA8的新特性的学习,可以浅尝辄止,因为大部分现有的框架,目前而且以后相当长时间不会迁移到JAVA8上。
不过新特性Lambda表达式的引入,我感觉会爆发出另一批更为优秀的框架出来
从形式上看,λ表达式只是为你节省了几行代码。
但将λ表达式引入Java的动机并不仅仅为此。
Java8有一个短期目标和一个长期目标。
短期目标是:配合“集合类批处理操作”的内部迭代(脱离于客户代码)和并行处理(更高效地利用现代CPU);
长期目标是将Java向函数式编程语言这个方向引导
并不是要完全变成一门函数式编程语言,只是让它有更多的函数式编程语言的特性,
也正是由于这个原因,Oracle并没有简单地使用内部类去实现λ表达式,而是使用了一种更动态、更灵活、易于将来扩展和改变的策略。
简单了解JAVA8的新特性的更多相关文章
- java8的新特性以及用法简介
1. 介绍 2 接口的默认方法 2 lambda表达式 2.1 函数式接口 2.2 方法与构造函数引用 2.3 访问局部变量 2.4 访问对象字段与静态变量 3. 内建函数式接口 3.1 Predic ...
- Java8 Stream新特性详解及实战
Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...
- Java8常用新特性实践
前言: 时下Oracle开速迭代的Java社区以即将推出Java10,但尴尬的是不少小中企业仍使用JDK7甚至JDK6开发. 从上面列出的JDK8特性中我们可以发现Java8的部分特性很明显的是从Sc ...
- Java8的新特性以及与C#的比较
函数式接口 VS 委托 在C中,可以使用函数指针来存储函数的入口,从而使得函数可以像变量一样赋值.传递和存储,使得函数的调用变得十分灵活,是实现函数回调的基础.然而函数指针不存在函数的签名信息,甚至可 ...
- java5、java6、java7、java8的新特性
Java5: 1.泛型 Generics: 引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...
- Java8部分新特性的学习
Java8中的新特性 一.Lambda表达式 Lambda表达式可以理解为一种可传递的匿名函数:它没有名称,但又参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名:和匿名类类似的,它 ...
- 深度分析:java8的新特性lambda和stream流,看完你学会了吗?
1. lambda表达式 1.1 什么是lambda 以java为例,可以对一个java变量赋一个值,比如int a = 1,而对于一个方法,一块代码也是赋予给一个变量的,对于这块代码,或者说被赋给变 ...
- java7与java8的新特性
java7 新特性: 1. switch 里面的 case 条件可以使用字符串了. 2. 运用 List\tempList = new ArrayList<>(); 即泛型实例化类型自动判 ...
- Java8接口新特性
概述 Java 8中,你可以为接口添加静态方法和默认方法.从技术角度来说,这是完全合法的,只是它看起来违反了接口作为一个抽象定义的理念.猜想设计初衷可能使为了兼容8以下的jdk Java8出来了个函数 ...
随机推荐
- IT架构之IT架构标准——思维导图
参考: [日] 野村综合研究所系统咨询事业本部. 图解CIO工作指南. 周自恒译 人民邮电出版社,2014
- PHP扩展迁移为兼容PHP7记录
PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容.有不少方法参数做了调整.下面是在迁移过程中遇到的一些问题.记录下来,避免大家再踩坑. PHP7扩展开发之hello w ...
- NodeJS异常处理uncaughtException篇
很多 NodeJS 的开发者在抱怨异常处理太麻烦,我们会通过一些列博客梳理一下NodeJS中常见的异常处理的手段. 和大多数编程语言一样,在 NodeJS 里可以通过throw抛出一个异常: thro ...
- 提高Python运行效率的六个窍门
曾灵敏 - MAY 18, 2015 Python是一门优秀的语言,它能让你在短时间内通过极少量代码就能完成许多操作.不仅如此,它还轻松支持多任务处理,比如多进程. 不喜欢Python的人经常会吐嘈P ...
- Selenium获取input输入框中值的三种方法
第一种用jQuery的val方法: js = "return $('input').val();" driver.execute_script(js) 第二种用jQuery的att ...
- POJ 2195
#include<iostream>//by Chengdacaizi #include<stdio.h> #include<vector> #include< ...
- ***ECharts图表入门和最佳实践
ECharts数据图表系统? 5分钟上手! [ECharts简介] ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动, ...
- hdu 4061 A Card Game
思路: 分析:假设取的牌顺序是一个序列,那么这种序列在末尾为1时是和取牌序列一一对应的,且是符合“游戏结束时牌恰好被取完”的一种情况. 简证:1.在序列中,任一数 i 的后一个数 j 是必然要放在第 ...
- jquery 中$.post获取MVC Controller中JsonResult返回包含LIst<Model>类型的子List<Model>的高级使用方法
比如JsonResult中返回return Json(models);的models结构如下: models返回含有四个集合的序列,每个集合的序列中又包含一个子集合序列“Child”. 问题是如果我们 ...
- hdu 4664 Triangulation(题意已在讨论版中说明)
题意: 给定n个平面(平面之间相互独立),每个平面上有一些点,并且构成凸集,C和D轮流选一个平面连接两个点画线段,并保证线段之间除了端点之外没有其它交点,当平面上出现一个完整的三角形之后此平面就不能继 ...