Java8新特性
文章平均质量分 71
Archie_java
求知若饥,虚心若愚(stay hungry,stay foolish)
好记性不如烂笔头
展开
-
Java8 Stream 极大简化了代码,它是如何实现的?
正如我们上面那个列子的情况分析得知,lambda的执行并不是瞬间完成的,所有使用parallel streams的程序都有可能成为阻塞程序的源头, 并且在执行过程中程序中的其他部分将无法访问这些workers,这意味着任何依赖parallel streams的程序在什么别的东西占用着common ForkJoinPool时将会变得不可预知并且暗藏危机。在我们最初的并行分解描述中,我们采用的概念是拆分来源,直到分段足够小,以致解决该分段上的问题的顺序方法更高效。个元素,这让执行效率变得高得多。原创 2023-06-23 11:34:40 · 188 阅读 · 0 评论 -
Java中foreach的实现原理
指令进行反编译查看一下字节码指令,或者如果用的是Intellij idea的话,里面内置了Fernflower decompiler,直接打开.class文件会直接显示反编译后的代码(记得在查看class文件之前要先执行一下它的java文件)。foreach循环遍历对象的时候底层是使用迭代器进行迭代的,即该对象必须直接或者间接的实现了Iterable接口,一般以able结尾代表某种能力,实现了iterable代表给予了实现类迭代的能力。这里我是找到我的Test.java文件的地址,拖到桌面上然后执行。原创 2023-05-07 23:22:26 · 1483 阅读 · 0 评论 -
Java8中Collectors.groupingBy的坑,分组乱序
【代码】Java8中Collectors.groupingBy的坑,分组乱序。原创 2023-05-07 19:31:24 · 249 阅读 · 0 评论 -
Java Stream 处理分组后取每组最大&Stream流之list转map、分组取每组第一条&Java 8 Collectors:reducing 示例(List分组取最值)
JDK1.8推出的stream流能极大的简化对集合的操作,让代码更美观,老规矩,直接上代码。实际业务中根据业务合理利用stream流能够很大程度的简化代码,但是这种写法在出现bug的时候排查较为复杂,建议不要在使用stream流的时候在其中写太复杂的逻辑。Java 8利用Comparator(比较器)和BinaryOperator(二元运算符)进行减少流中的元素。返回带有Optional数据的Collector(收集器)。在JavaDoc的方法语法如下。返回一个Optional类的收集器。我们需要传递。原创 2023-04-17 23:49:33 · 11438 阅读 · 0 评论 -
Java 8 Stream实用篇,玩转集合的筛选、归约、分组、聚合
Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。原创 2023-03-26 20:22:33 · 2092 阅读 · 0 评论 -
Java基础系列-Collector和Collectors
Collector是专门用来作为Stream的collect方法的参数的。而Collectors是作为生产具体Collector的工具类。整个Collectors工具类就是在为Collector服务,用于创建各种不同的Collector。部分功能与Stream中的方法重合了,为了简化代码,完全不必采用Collectors实现,优先Stream方法。原创 2023-02-18 18:26:25 · 365 阅读 · 0 评论 -
Java8中Stream流求最大值最小值
【代码】Java8中Stream流求最大值最小值。原创 2023-02-18 18:19:47 · 18856 阅读 · 0 评论 -
【Java 8系列】Stream详解
Java 8的另一大亮点Stream,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。原创 2023-01-02 23:11:14 · 704 阅读 · 2 评论 -
关于Java:Collectors.summingInt()与mapToInt()与sum()
当您要对流中的整数值求和时,有两种主要的实现方式:第一个涉及对返回的整数进行装箱使用mapToInt()允许您在终端操作之前链接其他IntStream操作。相反,Collectors.summingInt()可以与其他收集器(例如用作groupingBy收集器中的下游收集器。对于这些用例,毫无疑问要使用哪个。在特殊情况下,当您不链接更多操作或不首先与收集器打交道时,这两种方法之间就没有根本的区别。尽管如此,使用更具可读性的方法还是有道理的。通常,当流上存在预定义的操作时,您就不会使用收集器。当您只能使用原创 2022-12-06 00:01:29 · 1610 阅读 · 0 评论 -
Java8 Stream集合的筛选、归约、分组、聚合详解+案例
先贴上几个案例,水平高超的同学可以挑战一下:用传统的迭代处理也不是很难,但代码就显得冗余了,跟Stream相比高下立判。Java 8 是一个非常成功的版本,这个版本新增的,配合同版本出现的 ,给我们操作集合(Collection)提供了极大的便利。那么什么是?可以由数组或集合创建,对流的操作分为两种:另外,有几个特性:可以通过集合数组创建。1、通过 方法用集合创建流2、使用方法用数组创建流3、使用的静态方法:输出结果:和的简单区分: 是顺序流,由主线程按顺序对流执行操作,而是并行流,内部以多线程并转载 2022-12-05 23:44:37 · 1965 阅读 · 0 评论 -
Collectors.collectingAndThen()&&Collectors.collectingAndThen 去重&&Stream分组groupBy后取单一字段值、取列表第一个值方式
函数应该最像 了,它可接受两个参数,第一个参数用于 操作,而第二参数用于 操作。也就是,先把流中的所有元素传递给第一个参数,然后把生成的集合传递给第二个参数来处理。例如下面的代码collectingAndThenExample结果一点唠叨:原创 2022-11-26 22:19:46 · 3658 阅读 · 0 评论 -
【编程技巧】Stream流之list转map、分组取每组第一条
实际业务中根据业务合理利用stream流能够很大程度的简化代码,但是这种写法在出现bug的时候排查较为复杂,建议不要在使用stream流的时候在其中写太复杂的逻辑。转载 2022-11-24 23:18:04 · 4648 阅读 · 0 评论 -
Java8之Function函数、BiFunction函数详解
它也是一个函数式接口,它是Function 的 另一种形式,它接收两个参数(T,U),返回一个参数(R)。那么接下来我们看看这个接口里面有哪些方法吧。原创 2022-11-23 10:48:14 · 8549 阅读 · 0 评论 -
Stream.sorted
Stream支持并非操作,不存在Stream并发时,上边的方法可以实现分组后排序操作,存在Stream并发时就不行,会乱。然后就是两个并行流的排序,因为是并行流因此无法得到固定的顺序,因此在并行流中使用这两个方法一定要慎重。这两个方法都是有状态的中间操作,对于有序流排序结果是固定的,对于无序流则无法保证得到固定的排序结果。无参的方法按照自然顺序排序,有参数的方法根据自定义的比较器进行比较排序。这行代码是根据自定义的比较器进行排序,这里定义的作用就是逆序排序。对流中元素进行排序,排序后的元素放到新流中返回。原创 2022-11-22 23:56:57 · 956 阅读 · 0 评论 -
解决Java8 分组groupingBy 后排序不变的问题
LinkedHashMap有序,HashMap无序LinkedHashMap是HashMap的子类,内部维护了一个双向链表保证元素插入时候的顺序,其增删改查的时间复杂度为O(1)LinkedHashMap的节点占用了更多的空间,包括指向前一个节点的指针before和指向后一个节点的after指针LinkedHashMap默认使用插入顺序进行遍历,也可以使用访问顺序进行遍历。将置为true即可。原创 2022-11-22 23:37:16 · 868 阅读 · 0 评论 -
Java8 Stream 之groupingBy 分组详解
功能代码/*** 使用java8 stream groupingBy操作, 基于Distinct 去重数据;});} /*** 自定义重复key 规则}/*** Java 8 Stream 之groupingBy 分组讲解**/*** 数据初始化List < String > citys = Arrays . asList("湖南" , "湖北" , "江西" , "广西 ");i < 10;i ++) {原创 2022-11-22 23:24:19 · 8841 阅读 · 0 评论 -
【Java 8 新特性】Java Comparator.reverseOrder | 倒序排序-静态方法
是Java 8中引入的一个静态方法,它返回比较器,对对象集合进行反向自然排序。对于自然排序,一个类需要实现Comparable并定义compareTo方法。一个对象集合根据自然排序中的compareTo进行排序。反转了自然排序。它在内部调用并返回比较器实例。查找的Java源代码。还提供了方法,该方法对对象集合施加自然顺序。数字的自然顺序是数字顺序,字符串按字母顺序排序,日期按时间顺序排序。Integer、String和Date等Java类实现Comparable并重写其compareTo。原创 2022-11-22 23:15:52 · 6776 阅读 · 0 评论 -
Stream的Collectors.groupingBy支持key为null进行分组
在使用Collectors.groupingBy分组时,如果分组的字段中有值为null,会抛出空指针异常。原创 2022-10-22 23:39:01 · 1532 阅读 · 0 评论 -
Java8时间间隔计算Period.between与LocalDate.until区别&LocalDate,LocalDateTime计算两个时间的相差时间
记录一线上问题,编辑会员卡信息,有效期截止时间由2022-04-17修改为2023-04-18,操作成功之后显示剩余的有效天数为24天,实际上怎么也得有三百多天.之前本地测试一直没有问题,现将定位过程记录一下.本地复测之后发现计算的是24天,果然有问题.看一下实现的源码发现问题所在,确实还是用之前没有了解清楚api的用法.最终调用的是,源码如下:Period.between计算两个日期间隔是按照年月日来计算,可以理解为2023-03-14和2022-04-18差0年,10个月,24天;转载 2022-10-22 22:43:19 · 2881 阅读 · 0 评论 -
LocalDateTime工具类:根据当前、周、月、季度、半年、年等维度获取时间&hutool工具包获取农历日期,生肖,传统节日
*** 一周的第一天** @param localDate 当地日期} /*** 一周的最后一天** @param localDate 当地日期} /*** 月的第一天** @param localDate 当地日期} /*** 月的最后一天** @param localDate 当地日期} /*** 每年的第一天** @param localDate 当地日期} /*** 每年的最后一天** @param localDate 当地日期。原创 2022-10-22 21:32:23 · 3943 阅读 · 0 评论 -
Java日期时间(LocalDate、LocalTime、LocalDateTime)
Java中1.8之前有date类,date类到了1.8大部分的方法被弃而且date类如果不格式化可读性十分差,而simpledateformat方法中format和parse方法都是线程不安全的。Java1.8之后出现了localdate,localdatetime,localtime这些类,而这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,有点类似于String类,所以这些类都是线程安全的。原创 2022-10-22 21:10:39 · 4207 阅读 · 2 评论 -
Java8中Stream为什么要boxed
在介绍boxed前,先看下面一个案例。转载 2022-10-09 23:59:25 · 1133 阅读 · 1 评论 -
Java8中计算时间的四种方式及区别Period、Duration、ChronoUnit、Until & 时间区间Duration的简单使用
Period类计算只有年、月、日计算的是LocalDate两个时间间隔的年月日。原创 2022-10-07 22:44:13 · 3067 阅读 · 0 评论 -
LocalDate详解
*** localDate 设值自定义日期* 根据指定日期/时间创建对象System . out . println("自定义的年月日: " + yyyyMMdd);System . out . println("自定义时分秒毫秒: " + HHmmssSSS);System . out . println("自定义年月日时分秒毫秒: " + yyyyMMddHHmmssSSS);转载 2022-10-07 22:23:08 · 15640 阅读 · 1 评论 -
java8 函数编程Consumer使用详解
从源码来看,Consumer函数主要有两个方法,accept和andThen。建立演示方法:执行结果:演示二创建一个car汽车类创建演示方法:执行结果:演示三执行结果:consumer从字面上面来理解就是消费的意思,用过mq的,应该大概可以了解到意思。我们先来看看Java8定义的这个consumer的接口:该接口被@FunctionalInterface注解修饰,这个注解的意思代表的是这个接口只有一个抽象接口方法,如果超过一个,只不能不用该接口,会编译不通过。该接口有一个抽象方法acc原创 2022-06-20 23:14:04 · 4042 阅读 · 1 评论 -
Java8排序 Stream的sorted方法
Java 8 Stream之sorted()排序示例:使用java 8 的流式排序功能说明:以自然序或着自定义 接口排序规则来排序一个流。功能详细说明:1、 默认使用自然序排序, 其中的元素必须实现 接口2、 :我们可以使用lambada 来创建一个 实例。可以按照升序或着降序来排序元素。官网代码示例:实战:按照文件编号进行排序,并计算相关文件的最小页次和最大页次Stream.sorted 多字段排序通过Comparator.thenComparing()实现功能说明:1.先以年龄升序2.当年龄相原创 2022-06-06 21:59:19 · 7465 阅读 · 2 评论 -
Java Stream Collectors.groupingBy()实现分组(单字段分组,多字段分组)
1 User实体类public class User { private Long userId; /** * 用户名(登录) */ private String username; /** * 年龄 */ private int age; /** * 性别 */ private int sex; /** * 密码 */ private String pa原创 2022-01-10 23:42:32 · 2266 阅读 · 0 评论 -
java8中的map与flatmap区别
map:只能返回一个值flatmap:返回多个值new ArrayList().stream().map(x -> x);//返回一个new ArrayList().stream().flatMap(x -> Arrays.asList(x.split(" ")).stream());//返回一个流,也就是多个值看API声明可以发现,flatmap接受的参数是流类型,map接受的非流类型,flatmap会把结果中的所有流的所有元素合并起来。问题假如我们有这样一个需求给定单词列表[“H原创 2021-12-08 23:49:10 · 2294 阅读 · 1 评论 -
java8中的Collectors.groupingBy用法
Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组数据准备:public Product(Long id, Integer num, BigDecimal price, String name, String category) { this.id = id; this.num = num; this.price = price; this.name = name; this.category = category;}Product prod1 = new原创 2021-11-20 18:05:35 · 1087 阅读 · 0 评论 -
Java8 Stream 流机制和 Lambda 表达式
一、Stream 流介绍与使用场景Stream 流介绍java8 中的stream 与InputStream和OutputStream是完全不同的概念, stream 是用于对集合迭代器的增强,使之完成能够完成更高效的聚合操作(过滤、排序、统计分组)或者大批量数据操作。stream 与 Lambda 表达式结合后编码效率大大提高,可读性更强。举例如下:// 获取所有红色苹果的总重量appleStore.stream().filter(a -> "red".equals(a.getCol原创 2021-11-20 17:57:19 · 318 阅读 · 0 评论 -
Java 8 Stream 流用法及语法
Java 8 Stream 流用法1.简介Stream流 最全的用法Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,Stream API 提供了一种高效且易于使用的处理数据的方式为什么用Java 8 Stream ?因为 操作简单为什么操作简单?因为 Lambda 表达式,它极大的提高了编程效率和程序可读性怎么操作流? 首先你的有个数据源(数组、集合),操作会产生新的流对象,原来的流对象不会改变流用法有结束操原创 2021-11-20 17:13:30 · 548 阅读 · 0 评论 -
Java 8 Stream Api 中的 peek、map、foreach区别
#1. 前言我在Java8 Stream中讲述了 Java 8 Stream API 的一些内容。今天再看一下peek、map、foreach区别。2. peekpeek 操作接收的是一个 Consumer 函数。顾名思义 peek 操作会按照 Consumer 函数提供的逻辑去消费流中的每一个元素,同时有可能改变元素内部的一些属性。这里我们要提一下这个 Consumer 以理解 什么是消费。2.1 什么是消费 (Consumer)package java.util.function;imp原创 2021-11-20 17:10:12 · 1606 阅读 · 1 评论 -
java8 Stream API详解
文章目录一、Stream流概述二、创建Stream的方式相关API三、Stream的中间操作筛选与切片映射排序四、终止操作第一大类API(太过简单)第二大类AP归约收集一、Stream流概述1、java8中有两大最为重要的改变,第一就是Lambda表达式,另一个则是Stream API。2、Stream API真正把函数式编程风格引入到Java中。这是目前为止,java类库中最好的补充,因为Stream API可以极大地提高java程序员的生产力,让程序员写出高效率、干净、简洁的代码。3、Strea原创 2021-11-20 16:43:40 · 1106 阅读 · 0 评论 -
Java番外篇2——jdk8新特性
Java番外篇2——jdk8新特性1、Lambda1.1、无参无返回值public class Test { interface Print{ void print(); } public static void main(String[] args) {// Print print=new Print() {// @Override// public void print() {//原创 2021-09-04 14:42:13 · 867 阅读 · 0 评论 -
【Java 8 新特性】Java Stream.of()用法示例
本页将介绍Java Stream.of方法示例。Stream.of用于为给定元素创建顺序流。我们可以传递单个元素或多个元素。查看javadoc中Stream.of方法声明。static <T> Stream<T> of(T t) 参数:传递单个元素。返回:该方法返回一个包含一个元素的流。static <T> Stream<T> of(T... values) 参数:传递多个元素。返回:该方法返回包含给定元素的流。Stream.of创建有限元原创 2021-10-10 22:05:07 · 332 阅读 · 0 评论 -
【java8新特性】——默认方法(五)
一、简介默认方法是指接口的默认方法,它是java8的新特性之一。顾名思义,默认方法就是接口提供一个默认实现,且不强制实现类去覆写的方法。默认方法用default关键字来修饰。默认方法可以解决的痛点:在java8之前,修改接口功能通常会给接口添加新的方法,这时对已经实现该接口的所有实现类,都要一一添加对新方法的实现,换言之,在给接口定义新方法的同时无法不影响到已有的实现类,这时,java8的默认方法特性就可以解决这种接口修改与已有实现类不兼容的问题,比如java8中Iterable接口添加的forEac原创 2021-10-09 23:41:43 · 3748 阅读 · 0 评论 -
【java8新特性】——方法引用(四)
一、简介方法引用是java8的新特性之一, 可以直接引用已有Java类或对象的方法或构造器。方法引用与lambda表达式结合使用,可以进一步简化代码。来看一段简单代码: public static void main(String[] args) { List<String> strList = Arrays.asList(new String[] { "a", "c", "b" }); strList.stream().sorted((s1, s2原创 2021-10-09 23:37:00 · 461 阅读 · 0 评论 -
【java8新特性】——Optional详解(三)
一、简介Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException)。我们来看一段代码: public static String getGender(Student student) { if(null == student)原创 2021-10-09 22:14:37 · 785 阅读 · 0 评论 -
【java8新特性】——Stream API详解(二)
一、简介java8新添加了一个特性:流Stream。Stream让开发者能够以一种声明的方式处理数据源(集合、数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation)和大批量数据操作 (bulk data operation)。Stream API将处理的数据源看做一种Stream(流),Stream(流)在Pipeline(管道)中传输和运算,支持的运算包含筛选、排序、聚合等,当到达终点后便得到最终的处理结果。几个关键概念:元素 Stream是一个来自数据源的元原创 2021-10-09 21:50:05 · 506 阅读 · 0 评论 -
【java8新特性】——lambda表达式与函数式接口详解(一)
一、简介java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式、函数式接口、方法引用、默认方法、新工具(编译工具)、Stream API、Date Time API、Optional等 。 当前很多公司的老产品依然使用的java7,甚至开发人员开发新产品时依然没有选择升级, 写关于java8系列文章的目的在于梳理和分享java8新增的主要特性,开发时也可以用作参考。lambda表达式是java8新增的主要特性之一,lambda表达式又称闭包或匿名函数,主要优点在原创 2021-10-09 21:35:40 · 798 阅读 · 0 评论