精华内容
参与话题
问答
  • Java8编程实战

    万人学习 2016-12-31 18:03:03
    Java一直作为优秀的编程语言活跃于软件开发行业,掌握Java不仅是一件兴奋的事,更是一把可以帮助你轻松进入软件行业大门的一把金钥匙,本套课程将为读者讲解Java8的所有核心技术知识,一共240集的Java8开发课程,...
  • Java8

    千次阅读 2014-11-04 10:30:18
    相信对于java8这个字眼大家都已经不陌生了,但是对于java8的了解和使用很多人还不是很清楚,甚至很多人还在犹豫着要不要用java8,那么我写这篇文章的目的就是告诉你,你一定要使用java8以及你为什么要使用java8.

    java8优势  

    相信对于java8这个字眼大家都已经不陌生了,但是对于java8的了解和使用很多人还不是很清楚,甚至很多人还在犹豫着要不要用java8,那么我写这篇文章的目的就是告诉你,你一定要使用java8以及你为什么要使用java8.  


    lambda   

    在Java7以及之前的代码里,为了实现带一个方法的接口,往往需要定义一个匿名类并复写接口方法,代码显得很臃肿。  
    比如我们用来给数组排序的Comparator接口:  
    String[] str = "aa、bb、cc、dd".split("、");
    Arrays.sort(str, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return s1.toLowerCase().compareTo(s2.toLowerCase());
        }
    });

    然而对于这种只有一个方法的接口,在Java8里面,我们可以把它视为一个函数,用lambda表示式简化如下的操作:  
    String[] str = "aa、bb、cc、dd".split("、");
    Arrays.sort(str, (s1, s2) -> {
        return s1.toLowerCase().compareTo(s2.toLowerCase());
    });

    这样我们的代码看着就简洁了很多,或许单单看这一个例子大家还体会不到lambda那神奇的魔力.  
    如果接触过jedis的朋友,相信都知道在使用jedis的时候会有获取连接,进行操作,释放连接这几个步骤。  
    大家能看出来,除了进行操作这个步骤是不同的,连接的获取和释放代码是相同的,那么这时候我们就可以考虑用lambda表达式把他封装起来。


    stream   

    集合类新增的stream()方法用于把一个集合变成Stream,然后,通过filter()、map()等实现Stream的变换。Stream还有一个forEach()来完成每个元素的迭代。

    例如要遍历一个list,要对这个list做一个for遍历  

    代码是这样的:  
     List<String> a = new ArrayList<String>();
            for (String o : a) {
                System.out.println(o)
            }
    而我用了stream之后,代码却简洁成这个样子:  
            List<String> a = new ArrayList<>();
            a.stream().forEach(c-> System.out.println(c));


    在比如我想取得这个list的的前10项:  
    List<String> list = oldList.limit(10).collect(Collectors.toList());
    那么如果我想取得数列的第20~30项,可以这样做:  
    List<String> list = oldList.skip(20).limit(10).collect(Collectors.toList());
    而且Stream有串行和并行两种,串行Stream上的操作是在一个线程中依次完成,而并行Stream则是在多个线程上同时执行。  
    stream提供了parallelStream使用多线程进行操作,加大了运算效率.  

    Stream中还有fifter、sorted、Match、map、Reduce这一类的api,大家可以在日后的使用中慢慢去体会他的强大之处.    

     

    optional

    Optional 不是函数是接口,这是个用来防止NullPointerException异常的辅助类型,这是下一届中将要用到的重要概念,他最初源自于google出的框架包guava之中,于1.8正式引入到jdk中使用  

    Optional 被定义为一个简单的容器,其值可能是null或者不是null。在之前一般某个函数应该返回非空对象但是偶尔却可能返回了null,然后这样的结果或许可能会让你的程序出现NullPointerException,会造成程序的崩溃等不可预估的问题,而在Java 8中,不推荐你返回null而是返回Optional。  
    Optional<String> optional = Optional.of("bam");
    
    
    optional.isPresent();           // true
    optional.get();                 // "bam"
    optional.orElse("fallback");    // "bam"
    
    
    optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "b"


    构造函数  

    在java8之前我们新建一个对象都是这样的`User u = new User()`   
    而在java8中我们可以这么写代码`User u = User::new `   


    方法引用 

    我经常把方法引用和lambda合在一起使用   
    比如我们有一个业务需要把集合里每个元素做处理   
    那么我们根据业务规范要把这个处理的事件写成一个业务方法,然后遍历集合元素,并传递元素调用该方法   

    一般我们在使用java8以前都是这么写的:  
    //声明一个名为doSomeThing的方法  
    public void doSomeThing(String item){
       // TODO
    }
    
    
    List<String> list = new ArrayList<String>();
    for(String item:list){
       doSomeThing(item);
    }
    那么在java8中,上面的东西我很简单的就搞定了`list.stream().foreach(item->doSomeThing(item))`  

    我用方法引用再简化一下上面的代码,就变成了现在这个样子`list.stream().foreach(this:: doSomeThing)`,很牛逼是不是!  


    hashMap的优化  

    - 如果在hash冲突的时候,链表长度大于默认因子数8的时候,会变更为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能,用以提高效率.  
    - JDK1.7中rehash的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会倒置,JDK1.8不会倒置.  

    详细的优化请参考美团技术团队写的这篇文章*[Java 8系列之重新认识HashMap](http://tech.meituan.com/java-hashmap.html)*    


    concurrentHashMap的优化 

    concurrentHashMap变成了cas无锁模式,只有在扩容的时候才会用sync进行锁,cas的无锁模式使得concurrentHashMap在吞吐量上有了一定等级的提升  

    参考的文章

    展开全文
  • 2020年支持java8的Java反编译工具汇总

    万次阅读 多人点赞 2018-06-29 10:58:53
    luyten是一款操作简单、功能实用的java反编译工具,软件支持*.JAR、*.zip、*.class等类型文件的反编译操作,还原度非常高,支持更多功能设置,如显式导入、类型、合成组件等等,用户可根据不同的需求选择合适的显示...

         大多商业软件,会对程序进行加密、加壳等安全措施以防范软件被破解,从而使得反编译越来越难。反编译是一个对目标可执行程序进行逆向分析,从而得到源代码的过程。尤其是像Java这样的运行在虚拟机上的编程语言,更容易进行反编译得到源代码。

          我们知道,在代码支撑方面,JDK 1.7引入了字符串Switch、泛型接口改进等新功能,1.8增加了lambda表达式、方法传递、多重注解等新特性,这使得反编译工具的编写难度加大。今天我们盘点一下目前仍然可用的、相对功能很强大的Java反编译工具(Eclipse插件不做评价),比较老的反编译工具很难支持Java8及其以上版本。

     

    1、Java 反编译器 JD-GUI

    JD-GUI 是一个用 C++ 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse、IntelliJ的插件JD-IntelliJ。JD-GUI不需要安装,直接点击运行,可以反编译jar,class文件。

    最新版本1.4.0,官方网站:http://jd.benow.ca/

     

    2、Java 反编译器 procyon-decompiler及其window下独立UI工具luyten

         Procyon-Decompiler支持JDK1.8类的反编译,在很多方面做得非常不错,如反编译匿名类、内部类、Java8 Lambda等等。Procyon-Decompiler支持JDK1.8类的反编译,在很多方面做得非常不错:字符串的Switch、枚举声明方面、注解方面、匿名类、内部类、Java8新接口规范、Java8 Lambda表达式、Java8 方法传递等。

          luytenProcyon的GUI,是一款操作简单、功能实用的java反编译工具,软件支持*.JAR、*.zip、*.class等类型文件的反编译操作,还原度非常高,支持更多功能设置,如显式导入、类型、合成组件等等,用户可根据不同的需求选择合适的显示项目,结果更明了。

         luyten的最新版本0.53,官方网址:https://github.com/deathmarine/Luyten,只需要下载luyten即可,不用下载ProcyonProcyon最新版本0.5.30。

     

    3、Android反编译gui工具Jadx

         jadx是一款Android反编译gui工具,它支持apk、dex、jar、class、zip、aar等文件。jadx操作方便,反编译后的代码可读性高,同时还拥有较完善的gui界面,除去混淆部分的代码,jadx已经非常接近源代码了。

       Jadx最高版本v0.7.1,官方地址https://github.com/skylot/jadx/

       三个工具中JD-GUI打开jar文件反编译速度飞快、luyten次之、Jadx最慢(有时候需要等好一会,喝杯咖啡先。三者都会遇到反编译不出来的情况,建议配合使用。

    展开全文
  • 对于中间操作和终端操作的定义,请看《JAVA8 stream接口 中间操作和终端操作》,这篇主要讲述的是stream的count,anyMatch,allMatch,noneMatch操作,我们先看下函数的定义 long count(); boolean anyMatch...

    对于中间操作和终端操作的定义,请看《JAVA8 stream接口 中间操作和终端操作》,这篇主要讲述的是stream的count,anyMatch,allMatch,noneMatch操作,我们先看下函数的定义

        long count();  
      
        boolean anyMatch(Predicate<? super T> predicate);  
      
        boolean allMatch(Predicate<? super T> predicate);  
      
        boolean noneMatch(Predicate<? super T> predicate);

    count方法,跟List接口的size一样,返回的都是这个集合流的元素的长度,不同的是,流是集合的一个高级工厂,中间操作是工厂里的每一道工序,我们对这个流操作完成后,可以进行元素的数量的和;

    剩下的三个方法,传入的都是Predicate的函数式接口,接口定义请看《JAVA8 Predicate接口》

    anyMatch表示,判断的条件里,任意一个元素成功,返回true

    allMatch表示,判断条件里的元素,所有的都是,返回true

    noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true

    下面,看几个例子

    List<String> strs = Arrays.asList("a", "a", "a", "a", "b");
            boolean aa = strs.stream().anyMatch(str -> str.equals("a"));
            boolean bb = strs.stream().allMatch(str -> str.equals("a"));
            boolean cc = strs.stream().noneMatch(str -> str.equals("a"));
            long count = strs.stream().filter(str -> str.equals("a")).count();
            System.out.println(aa);// TRUE
            System.out.println(bb);// FALSE
            System.out.println(cc);// FALSE
            System.out.println(count);// 4

    通过例子可以看到,变量aa的表达式,strs里的元素,任意有“a”,表示true

    变量bb的表达式,strs里的元素,全部为“a”,表示true,否则false

    变量cc的表达式,strs里的元素,全部不为“a”,表示true,否则false

     

    1.lambda表达式

    《java8 Lambda表达式简介》

    《java8 lambda表达式,方法的引用以及构造器的引用》

    2.函数式接口

    《java8 函数式接口简介》

    《JAVA8 Function接口以及同类型的特化的接口》

    《JAVA8 Consumer接口》

    《JAVA8 Supplier接口》

    《JAVA8 UnaryOperator接口》

    《JAVA8 BiConsumer 接口》

    3.stream接口操作

    《java8 Stream接口简介》

    《 java8 Stream-创建流的几种方式》

    《JAVA8 stream接口 中间操作和终端操作》

    《JAVA8 Stream接口,map操作,filter操作,flatMap操作》

    《JAVA8 stream接口 distinct,sorted,peek,limit,skip》

    《java8 stream接口 终端操作 forEachOrdered和forEach》

    《java8 stream接口 终端操作 toArray操作》

    《java8 stream接口 终端操作 min,max,findFirst,findAny操作》

    《java8 stream接口终端操作 count,anyMatch,allMatch,noneMatch》

    《java8 srteam接口终端操作reduce操作》

    《java8 stream接口 终端操作 collect操作》

    4.其他部分

    《java8 Optional静态类简介,以及用法》

    展开全文
  • 文中都使用的时区都是东8区,也就是北京时间。这是为了防止服务器设置时区错误时导致时间不对,如果您是其他时区,请自行修改 1.LocalDateTime获取毫秒数 ​ //获取秒数 Long second = LocalDateT...

    本文目前提供:LocalDateTime获取时间戳(毫秒/秒)、LocalDateTime与String互转、Date与LocalDateTime互转

    文中都使用的时区都是东8区,也就是北京时间。这是为了防止服务器设置时区错误时导致时间不对,如果您是其他时区,请自行修改

     

    1.LocalDateTime获取毫秒数

    //获取秒数
    Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
    //获取毫秒数
    Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
    
    

     

    2.LocalDateTime与String互转

    //时间转字符串格式化
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
     String dateTime = LocalDateTime.now(ZoneOffset.of("+8")).format(formatter);
    
    //字符串转时间
    String dateTimeStr = "2018-07-28 14:11:15";
    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, df);

     

    3.Date与LocalDateTime互转

     

        //将java.util.Date 转换为java8 的java.time.LocalDateTime,默认时区为东8区
        public static LocalDateTime dateConvertToLocalDateTime(Date date) {
            return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
        }
    
       
        //将java8 的 java.time.LocalDateTime 转换为 java.util.Date,默认时区为东8区
        public static Date localDateTimeConvertToDate(LocalDateTime localDateTime) {
            return Date.from(localDateTime.toInstant(ZoneOffset.of("+8")));
        }
    
    
        /**
         * 测试转换是否正确
         */
        @Test
        public void testDateConvertToLocalDateTime() {
            Date date = DateUtils.parseDate("2018-08-01 21:22:22", DateUtils.DATE_YMDHMS);
            LocalDateTime localDateTime = DateUtils.dateConvertToLocalDateTime(date);
            Long localDateTimeSecond = localDateTime.toEpochSecond(ZoneOffset.of("+8"));
            Long dateSecond = date.toInstant().atOffset(ZoneOffset.of("+8")).toEpochSecond();
            Assert.assertTrue(dateSecond.equals(localDateTimeSecond));
        }

    想学习Python的Java老铁可关扫描下方猪哥vx公号

    展开全文
  • list去重,根据对象某个属性、某几个属性去重 去除List中重复的String List unique = list.stream().distinct().collect(Collectors.toList()); 去除List中重复的对象 // Person 对象 ... ...
  • Java8零基础入门视频教程

    万人学习 2016-09-29 14:23:29
    这门课程基于主流的java8平台,由浅入深的详细讲解了java SE的开发技术,可以使java方向的入门学员,快速扎实的掌握java开发技术!
  • 对于中间操作和终端操作的定义,请看《JAVA8 stream接口 中间操作和终端操作》,这篇主要讲述的是stream的min,max,findFirst,findAny操作,我们先看下函数的定义 Optional<T> min(Comparator<? super...
  • Java 8 中的哈希表

    万次阅读 2020-04-04 13:17:51
    JDK 的代码是开源的,我们打开idea开发工具,引入jdk1.8 找到hashmap HashMap 是基于 HashTable 的一种数据结构,在普通哈希表的基础上,它支持多线程操作以及空的 key 和 value。 在 HashMap 中定义了几个常量: ...
  • java8 手把手教你学会写lambda表达式

    万次阅读 多人点赞 2017-04-16 14:24:31
    Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论。Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8 之前我们想要将行为传入...
  • Java 14 都快来了,为什么还有这么多人固守Java 8

    万次阅读 多人点赞 2020-01-02 08:47:00
    Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
  • 在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。如果在网络上搜索JVM内存结构,90%的可能会搜到Java7及以前的内存图,本篇文章将会对JVM内存...
  • 最常用的 Java 8 中的 Lambda 函数(项目中实用笔记) 简介 Java 8 中的新特性,虽然现在都出到了Java14版本,不过在日常的开发过程中,8的版本是足够使用了,再说现在的8以上的版本也都面向商业收费了,很多新手,我...
  • Java8新特性Stream之list转map及问题解决

    万次阅读 多人点赞 2018-10-11 14:57:44
    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap 具体用法实例如下: //声明一个List集合 List&amp;lt;Person&... list = new ArrayList();... list.add(new Person
  • Java关键字(Java 8版本)

    千次阅读 多人点赞 2019-09-28 22:11:04
    定义 被Java语言赋予了特殊含义,用作专门...Java关键字(Java 8版本) Java关键字(Java 8 以后版本) 注意事项 true,false和,null看起来像关键字,但它们实际上是文字; 您不能在程序中将它们用作标识符。 ...
  • 采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集一般的javaList 交、并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的javaList对象,采用java8 lambda表达式流操作则可以不影响原始...
  • Java8 stream 之groupingBy() 分组排序

    万次阅读 热门讨论 2017-12-29 12:06:37
    List matchsList = new ArrayList(); Map&amp;gt; MatchsListMap = matchsList.stream() .collect(Collectors.groupingBy(Matchs::getMatchDate)); 此时MatchsListMap的排序规则是根据MatchDate降序的(默认)...
  • java8安装

    万次阅读 多人点赞 2019-05-19 10:31:50
    首先获取java8的安装包 可以通过百度搜索jdk1.8,第一个点击进入即为下载页面 点击进入还会有jdk8版本的不同更新时间的小版本,推荐使用最后更新的那个,大致如下图 点击接受,然后可以选择下载,可以根据自己系统...
  • Java8数组和List相互转换

    万次阅读 2016-11-28 15:00:11
    使用Java 1.8中的循环转换数组为List,代码: private List arrayToList(T[] objects) { return Stream.of(objects).map(object -> { return object; }).collect(Collectors.toList()); }
  • 32位java8,jdk8下载,解压版

    万次阅读 热门讨论 2018-08-15 14:22:23
    下面是java - version的信息,直接拿走。 java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) Client VM (build 25.151-b12, mixed mode) 解压密码:...
  • Java8深入分析

    万人学习 2016-09-29 15:01:32
    Java语言进阶视频教程,该课程针对有一定Java基础的学员,详细讲解Java多线程、XML、Socket、Swing、IO流、反射、注解,还有传值与传址的区别 、递归算法等,使学员熟练掌握JavaSE技术,轻松应对职场挑战。
  • Java8中String.join方法,让我们的代码更优美

    万次阅读 多人点赞 2018-01-16 23:21:26
    Java8(14年3月19日)发布马上就四年了;相信接触过java8的人,会对它的很多新的特性新的方法有感觉;自然我也不例外;今天就一起给大家分享一个java8中的方法。 【善用新语法,让代码更优美】 一、简洁:最近...
  • Java8中的LocalDateTime工具类

    万次阅读 多人点赞 2017-07-22 22:57:14
    网上搜索了半天都没有找到Java8的LocalDateTime的工具类,只好自己写了一个,常用功能基本都有。还在用Date的Java同道该换换了。 个人项目地址:https://github.com/KingBoyWorld/common.git,Common模块中有很多...
  • 前几天写了一篇 Java 8 即将在 2019 年停止免费向企业提供更新的文章,企图迫使用户向更新一代的 Java 版本升级,但让人遗憾的是,小编今天收到了 Oracle Java 版本的升级推送,装完居然是 Java 10 !!!! 很意外,...
  • 你打算用Java 8一辈子都不打算升级到Java 14,真香

    万次阅读 多人点赞 2020-03-26 10:04:35
    我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

空空如也

1 2 3 4 5 ... 20
收藏数 267,179
精华内容 106,871
关键字:

java8

java 订阅