java8

java8-lambda实战

久未见 提交于 2019-12-05 22:27:34
前言 java8推出已经很久了,然而其新特性却几乎没有怎么用过。原因是既然已有的只是满足需求何必去学习新的?然而,随着敲代码越来越多,业务上有很多臃肿繁琐的判断校验之类的代码,使得代码很长而且可读性很差。于是,重新捡起了java8。 [TOC] 实际用法 这里是实际代码中使用过的简单套式做法,随时更新。 list过滤 将满足需求的list元素筛选出来。 filter 返回一个boolean值,true的时候通过并放入一个stream里。 接收一个参数list,需要根据元素的某些条件来判断是否满足需求,将满足需求或者不满足需求的元素拿出来。这个正常代码也简单,遍历list,if判断,add赋值到结果集。然而,这个串代码仅仅是一个方法的前置校验部分,这会使得这个方法臃肿难以阅读。虽然重构提取函数可以提高可读性,但分散的代码管理也是麻烦。所以,java8的流式函数编程就适合: List<TipUI> badList = tips.stream().filter(tipUI -> StringUtils.isBlank(tipUI.getGaiaId())).collect(Collectors.toList()); list重组 操作list元素中的部分属性构建新的list map 用来转换元素 有个users列表,我想要或者这些user的id列表。 @Test public void

java8函数表达式的定义[Definition of a Lambda Expression]

馋奶兔 提交于 2019-12-05 08:18:14
英文来源于:Java in a Nutshell, 6th Edition            Definition of a Lambda Expression A lambda expression is essentially a function that does not have a name, and can be treated as a value in the language. As Java does not allow code to run around on its own outside of classes, in Java, this means that a lambda is an anonymous method that is defined on some class (that is possibly unknown to the developer).                         ---Java in a Nutshell, 6th Edition 其实正则表达式就是没有名字的函数,(参数,返回值,函数体),在java 语言中视为一个值. 因为java的函数必须在类中定义,这就意味着,java语言中的函数表达式即为在某类中定义的匿名方法. 函数表达式在java视为一个值,即:Runnable r = () ->

Java 8新特性探究(七)深入解析日期和时间-JSR310

淺唱寂寞╮ 提交于 2019-12-05 02:22:08
博客一个月没更新了,这次给大家讲下java8时间与日期API。 众所周知,日期是商业逻辑计算一个关键的部分,任何企业应用程序都需要处理时间问题。应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径 。但java之前的日期做法太令人恶心了,我们先来吐槽一下 吐槽java.util.Date跟Calendar Tiago Fernandez做过一次投票,选举最烂的JAVA API,排第一的EJB2.X,第二的就是日期API。 槽点一 最开始的时候,Date既要承载日期信息,又要做日期之间的转换,还要做不同日期格式的显示,职责较繁杂(不懂单一职责,你妈妈知道吗?纯属恶搞~哈哈) 后来从JDK 1.1 开始,这三项职责分开了: 使用Calendar类实现日期和时间字段之间转换; 使用DateFormat类来格式化和分析日期字符串; 而Date只用来承载日期和时间信息。 原有Date中的相应方法已废弃。不过,无论是Date,还是Calendar,都用着太不方便了,这是API没有设计好的地方。 槽点二 坑爹的year和month Date date = new Date(2012,1,1); System.out.println(date); 输出Thu Feb 01 00:00:00 CST 3912 观察输出结果,year是2012+1900,而month

Map在java8中排序

泄露秘密 提交于 2019-12-05 01:37:05
##HashMap不是有序的 java1.8重新修改了HashMap,结构变为数组+链表+红黑树(链表>8).因此,顺序取决于hash。 @Test public void testHashMapShouldBeOrderedButNotAlpha(){ Map<String, Integer> unsortMap = new HashMap<>(); unsortMap.put("z", 10); unsortMap.put("a", 6); unsortMap.put("d", 1); unsortMap.put("e", 7); unsortMap.put("b", 5); unsortMap.put("f", 8); unsortMap.put("n", 99); unsortMap.put("j", 50); unsortMap.put("c", 20); unsortMap.put("m", 2); unsortMap.put("f", 9); Assert.assertEquals("{a=6, b=5, c=20, d=1, e=7, f=9, z=10, j=50, m=2, n=99}", unsortMap.toString()); } ##使用stream排序收集为LinkedHashMap 因此,如果想要有序的map则必须转换成LinkedHashMap

Java 8新特性探究(一)通往lambda之路_语法篇

怎甘沉沦 提交于 2019-12-03 16:13:16
现在开始要灌输一些概念性的东西了,这能帮助你理解lambda更加透彻一点,如果你之前听说过,也可当是温习,所谓温故而知新...... 在开始之前,可以同步下载jdk 8 和 IDE,IDE根据个人习惯了,不过eclipse官方版本还没出来,所以目前看的话,netbean7.4是首选的,毕竟前段子刚刚出的正式版本,以下是他们的下载地址。 jdk 8: https://jdk8.java.net/download.html (毕竟是国外的网站,如果下载慢,可以到我的云盘下载 http://pan.baidu.com/share/link?shareid=61064476&uk=4060588963 ) Netbeans 7.4正式版 :https://netbeans.org/downloads/ (推荐,oracle官方发布) IDEA 12 EAP http://confluence.jetbrains.net/display/IDEADEV/IDEA+12+EAP Unofficial builds of Eclipse :http://downloads.efxclipse.org/eclipse-java8/ 函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西)。简单来说,函数式接口是只包含一个方法的接口

Joda-time学习笔记

 ̄綄美尐妖づ 提交于 2019-12-02 21:26:58
一、joda的优点展示 joda-time能够便捷地格式化时间输出、设定时间、加减时间、计算时间差值。跟JDK的Date/Calender相比一试便知,每个测试中上半部分是用jdk操作,下半部是用joda-time操作。最后一个我想……实在不想用jdk来实现: public class JodaTimeTest { @Test public void testPrintDate(){ Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String dateText = format.format(date); Assert.assertEquals("2014-11-13", dateText); DateTime dateTime = new DateTime(); dateText = dateTime.toString("yyyy-MM-dd"); Assert.assertEquals("2014-11-13", dateText); } @Test public void testAddDate(){ Calendar calendar = Calendar.getInstance(); calendar.set(2008, Calendar

JDK8中Lambda表达式底层实现浅析(一)

我的未来我决定 提交于 2019-12-01 23:10:45
1.前言 2014年十月份的时候Debug了下Lambda的实现代码, 大概了解了Lambda的实现, 昨天回忆了下, 发现以忘光, 还是写篇博客吧, 方便记忆 这篇文章是我本地Debug后记录下来的所见所闻, 不一定完全正确, 如有错误, 请务必指出. 2.环境 JDK: Oracle JDK1.8.0_05 64位 , Eclipse4.4 3.过程 初看Lambda时以为Lambda就是编译器帮我们把Lambda表达式给编译成了一个匿名内部类, 然后调用, 但是偶然间看到字节码文件后, 发现有点不同, 于是研究了下. //源码是这样的 public static void main(String[] args) throws Throwable { String hello = "hello lambda "; Function<String, Void> func = (name) -> { System.out.println(hello + name); return null; }; func.apply("haogrgr"); } //原本以为编译器会将Lambda表达式编译成这样. String hello = "hello lambda "; Function<String, Void> func = new Function<String, Void>() {

在Ubuntu14下构建Hotspot并使用Eclipse调试

坚强是说给别人听的谎言 提交于 2019-12-01 02:17:58
偶尔会看一点点JVM代码,所以尝试构建了一把最新的OpenJDK8 1.环境介绍 1)时间: 2015-05-13 2)系统: Linux haogrgr-vm 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 3)Eclipse: Eclipse C/C++ 4.4 4)OpenJDK代码: http://hg.openjdk.java.net/jdk8u/jdk8u40 2.JDK安装 这里安装的是构建OpenJDK需要依赖的JDK, 一般是当前构建版本的上一个版本, 比如我们这里需要安装JDK7. sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java7-installer sudo apt-get install oracle-java7-set-default # 如果你要安装JDK8: # sudo apt-get install oracle-java8-installer # sudo apt-get install oracle-java8-set-default #

新款时间日期API已上线

一世执手 提交于 2019-11-30 09:24:07
历史 早期,Java 对时间和日期的使用往往重度依赖 java.util.Date 和 java.util.Calendar 。 可惜的是,这2个api 本身不够健壮,有类似线程不安全等诸多问题,于是乎2000年左右,市面上出现了很多用于处理时间类的框架,如Joda-Time。 在Java 8 时代 官方为JDK开发新的时间/日期API的进程:JSR-310,启动了。于是就出现了新一套健壮的API。 Roadmap 新的API Java 8 中 新的API 包括了 5个包 java.time java.time.chrono java.time.format java.time.temporal java.time.zone java.time 是基础包,里面包含了 时间 日期的 基础类 如 LocalDate, LocalTime等 java.time.chrono 有点像linux 的守护进程 chronyd 用来访问不同的时间服务器。 java.time.format 顾名思义用来格式化和转换日期时间 java.time.temporal 可能也想不出好名字吧,里面都是些底层扩展类 java.time.zone 用来对各时区的支持 1. 时间线 Java8中 引入了时间线的概念,时间是连续不断,抽象成一条线,线上的点表示某一时刻。 一班来说,这个设定主要是面对机器的

30分钟入门Java8之lambda表达式

喜夏-厌秋 提交于 2019-11-30 05:26:21
30分钟入门Java8之lambda表达式 前言 Google在今年发布Android N开发者预览版 ,一并宣布开始支持Java 8。我们终于能在Android开发中使用到Java8的一些语言特性了。目前支持: 默认方法 lambda表达式 多次注解 今天我们就简要学习lambda表达式。 配置开发环境 首先需要下载安装JDK1.8。 如果想在Android开发中使用lambda表达式,需要在Android Studio中配置Java 8开发环境。 配置app的Gradle文件: 开启jack编译选项 设置编译选项兼容到1.8 android { defaultConfig { ... //开启jack编译 jackOptions { enabled true } } ... //将编译选项设置为Java1.8 compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 } } 出于种种原因,可能我们使用的JDK版本是1.7甚至更低,但是我们又想学习使用lambda表达式,怎么办呢?Github上已经有开发者设计了兼容lambda表达式到Java7,6,5的开源库 retrolamda 。至于如何在Android Studio中配置,在此就不啰嗦了。可以参看 Gradle Retrolambda Plugin