JDK1.8新增功能:线程安全的时间日期类;Lambda表达式;Stream流

【JDK8新特性】Stream API 结合Lambda语法在项目中的实战应用 在JDK8新特性实战 阅读详情

JDK1.8新增功能

一、时间日期类

1、LocalDate;LocalTime;LocalDateTime类

//获取当前时间
LocalDate.now();//年月日
LocalTime.now();//时分秒
LocalDateTime.now();//年月日时分秒
//获取指定时间
LocalDateTime.of(指定时间量);
//获取时间
getXxx();	//如:
now.getYear();//获取年
now.getMonth();//获取月(枚举类型)
now.getMonthValue();//月数(int类型)
//判断
now.isAfter(now2);//判断一个日期是否在指定日期后
now.isBefore(now2);//判断一个日期是否在指定日期前
now.isEqual(now2);//判断一个日期是否与指定日期相等
now.isLeapYear();//判断是否为闰年
//修改日期:每次修改完时间量都会返回新日期
now.withXxx(指定时间量);//指定时间
now.plusXxx();//增时间
now.minusXxx();//减时间
//格式化日期
DateTimeFormatter.ofPattern("yyyy年MM月dd日");
now.format(DateTimeFormatter formatter)
//解析日期
parse();
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;

public class MyTest {
    public static void main(String[] args) {
        //获取当前时间
        LocalDate now = LocalDate.now();
        LocalTime now1 = LocalTime.now();
        LocalDateTime now2 = LocalDateTime.now();
        //获取指定时间
        LocalDateTime of = LocalDateTime.of(2015, 9, 1, 12, 12, 12);
        //获取时间
        of.getYear();//获取年
        Month month = of.getMonth();//获取月
        of.getSecond();//获取秒
        //判断
        boolean leapYear = now.isLeapYear();//判断是否为闰年
        boolean after = now2.isAfter(of);//判断一个日期是否在指定日期后
        boolean before = now2.isBefore(of);//判断一个日期是否在指定日期前
        boolean equal = now2.isEqual(of);//判断一个日期是否与指定日期相等
        //修改时间:修改完返回的是新日期
        now.withYear(2011);//指定年
        now.plusYears(1);//年加1
        now.minusYears(1);//年减1
        //格式化日期
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        String format = now2.format(dateTimeFormatter);
        System.out.println(format);
        //解析日期
        LocalDate parse = LocalDate.parse("2019年08月04日", DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
        System.out.println(parse);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        TemporalAccessor parse1 = formatter.parse("2019年08月01日 10:10:10");
        System.out.println(parse1);
    }
}

2、Instant 时间戳类

A:获取对象的方法: now()
	注意默认获取出来的是当前的美国时间和我们相差八个小时
		Instant ins = Instant.now();
		我们在东八区,所以可以加8个小时,获得我们的北京时间
B:Instant中设置偏移量的方法:  atOffset()
    	//偏移8小时,即当前北京时间
		OffsetDateTime time = ins.atOffset(ZoneOffset.ofHours(8));
C:获取指定时区时间的方法: atZone()
		ZoneId.systemDefault() //获取本地的默认时区ID
    	//获取系统默认时区时间
		ZonedDateTime zonedDateTime = ins.atZone(ZoneId.systemDefault());
D:get系列的方法
	getEpochSecond() //获取从1970-01-01 00:00:00到当前时间的秒值
	toEpochMilli();//获取从1970-01-01 00:00:00到当前时间的毫秒值
	getNano()//把获取到的当前时间的毫秒数,换算成纳秒
	如:若当前时间为:2019-08-04T15:09:51.208+08:00
		则getNano()返回值为:208000000	
F: ofEpochSecond(int second) 给计算机元年增加指定秒数
	ofEpochMilli(int milli) 给计算机元年增加指定毫秒数		

3、Duration和Period

Duration : 用于计算两个“时间”间隔的类
静态方法:between() //计算两个时间的间隔,默认是秒
如:要计算for循环耗时
	Instant start = Instant.now();
		for(long i=0;i<1000L;i++){
			System.out.println("循环内容");
		}
	Instant end = Instant.now();
	Duration between = Duration.between(start, end);
	System.out.println(between.toMillis());
	toMillis()//将秒转成毫秒
Period : 用于计算两个“日期”间隔的类
静态方法: between(LocalDate d1,LocalDate d2)//计算两个日期之间的间隔
		getYears();//间隔了多少年
		getMonths();//间隔了多少月
		getDays();//间隔多少天

4、TemporalAdjuster(接口)

1、使用TemporalAdjusters自带的常量来设置日期:
	//一年的最后一天
	LocalDate with = LocalDate.now().with(TemporalAdjusters.lastDayOfYear());
2、采用TemporalAdjusters中的next方法来指定日期
	 LocalDate date = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
	例如:TemporalAdjusters.next(DayOfWeek.SUNDAY) 本周的星期天
	例如:TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY) 下一周的星期一
3、采用自定义的方式来指定日期,比如指定下个工作日
	LocalDateTime ldt = LocalDateTime.now();
	LocalDateTime workDay = ldt.with(new TemporalAdjuster() {
		@Override
	 public Temporal adjustInto(Temporal temporal) {
		 //向下转型
		 LocalDateTime ld = (LocalDateTime) temporal;
		 //获取这周的星期几
		 DayOfWeek dayOfWeek = ld.getDayOfWeek();
	 if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
			 return ld.plusDays(3);//如果这天是星期五,那下个工做日就是再过3天
		} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
			return ld.plusDays(2);//如果这天是星期六,那下个工做日就是再过2天
		} else {
			//其他就加一天
			return ld.plusDays(1);
	 }
        }
    });
    System.out.println(workDay);	

5、ZonedDate,ZonedTime,ZonedDateTime:带时区的时间或日期

  用法和 LocalDate、LocalTime、LocalDateTime一样,
  只不过ZonedDate,ZonedTime,ZonedDateTime 这三个类带有当前系统的默认时区

6、ZoneID 世界时区类

getAvailableZoneIds();//获取世界各个地方的时区的集合
ZoneId zoneId = ZoneId.systemDefault(); //Asia/Shanghai
ZoneId timeID=ZoneId.of("Asia/Shanghai");//获取指定时区ID对象
//根据指定时区ID对象获取指定时区当前时间
ZonedDateTime time=LocalDateTime.now().atZone(timeID);

二、Lambda表达式

	Lambda表达式是匿名内部类的简写方式,但必须函数式接口,才能用Lambda表达式
	函数式接口的定义: 只包含一个抽象方法的接口
Java给我们提供的函数式接口

4大核心函数式接口

函数式接口参数类型返回 类型用途
Consumer 消费型接口Tvoid对类型为T的对象应用操作,包含方法: void accept(T t)
Supplier 供给型接口无T返回类型为T的对象,包含方法: T get();
Function<T, R>函数型接口TR对类型为T的对象应用操作,并返回结果。结果是R类型的对象。包含方法: R apply(T t);
Predicate 断言型接口Tboolean确定类型为T的对象是否满足某约束,返回boolean 值。包含方法 boolean test(T t);

其他函数式接口

函数式接口参数类型返回类型用途
BiFunction<T,U,R>T UR对类型为 T, U 参数应用操作, 返回 R 类型的结果。 包含方法为 R apply(T t, U u);
UnaryOperator (Function的子接口)TT对类型为T的对象进行一元运算, 并返回T类型的结果。 包含方法为 T apply(T t);
BinaryOperator (BiFunction的子接口)`T TT对类型为T的对象进行二元运算, 并返回T类型的结果。包含方法为T apply(T t1, T t2);
BiConsumer<T,U>T Uvoid对类型为T, U 参数应用操作。 包含方法为 void accept(T t, U u)
ToIntFunction ToLongFunction ToDoubleFunctionTint long double分 别 计 算 int 、 long 、 double、 值的函数
IntFunction LongFunction DoubleFunctionint long doubleR参数分别为int、 long、 double 类型的函数

形式一

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class MyTest {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(10, 20, 1);
        //匿名内部类的写法
        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {

                return a-b;
            }
        });
        
        //第一步 简写,->左端是方法的参数列表,右端是方法的实现逻辑
        list.sort((Integer x,Integer y)->{
            return x-y;
        });
        //第二步简写 形参的数据类型可以省略不写
        list.sort((x,y) -> {
            return x - y;
        });

        //第三步简写:如果方法实现逻辑只有一行,可以省略{} 和 return
        //如果实现逻辑不是一行,则不能省略{}和return
        list.sort((x,y)->x-y);
    }
}

形式二:方法引用

条件:实现的抽象方法的参数列表和返回值类型,必须与方法引用方法的参数列表和返回值类型保持一致!
对象::实例方法
Consumer<String> con=(str)-> System.out.println(str);
        //方法引用形式
        Consumer<String> con1= System.out::println;
类::静态方法
BinaryOperator<Integer> bin=(a,b)->Math.max(a,b);
        //方法引用形式
        BinaryOperator<Integer> bin1= Math::max;
类::实例方法
//当实现的抽象方法的第一个参数是引用方法的调用对象,并且第二个参数是引用方法的参数时,可使用 类::实例方法 格式
Comparator<String> com=new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        };
        //方法引用形式
        Comparator<String> com1=String::compareTo;

形式三:构造器引用

格式:ClassName::new
Supplier<MyTest> su=()->new MyTest();
//构造器引用形式
Supplier<MyTest> su1= MyTest::new;

Function<String,MyTest> fun=(str)->new MyTest(str);
//构造器引用形式
Function<String,MyTest> fun1= MyTest::new;

三、Stream流

1、Stream概述

概述:Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
注意:
	Stream流 自己不会存储元素。
	Stream流 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
	Stream流 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
Stream 的操作三个步骤:
	1.创建 Stream
		一个数据源(如:集合、数组),获取一个流
	2.中间操作
		一个中间操作链,对数据源的数据进行处理
	3.终止操作(终端操作)
		一个终止操作,执行中间操作链,并产生结果

2、获取Stream流

1.Java8 中的 Collection 接口被扩展,提供了两个获取流的方法:
		default Stream<E> stream() : 返回一个顺序流
		default Stream<E> parallelStream() : 返回一个并行流 
2.Java8 中的 Arrays 的静态方法 stream() 可以获取数组流:
		static <T> Stream<T> stream(T[] array): 返回一个流
		 重载形式,能够处理对应基本类型的数组:
		 public static IntStream stream(int[] array)
		 public static LongStream stream(long[] array)
		 public static DoubleStream stream(double[] array) 
3.由值创建流,可以使用静态方法 Stream.of(), 通过显示值创建一个流。它可以接收任意数量的参数。
		 public static<T> Stream<T> of(T... values) : 返回一个流 
4.由函数创建流:创建无限流可以使用静态方法 Stream.iterate()和Stream.generate(), 创建无限流。
public static<T> Stream<T> iterate(final T seed, finalUnaryOperator<T> f)//迭代
public static<T> Stream<T> generate(Supplier<T> s)//生成

3、Stream 的中间操作

注意:多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行,
在终止操作时一次性全部处理,称为“惰性求值”。
1.筛选与切片
	filter(Predicate p)//过滤,从流中排除某些元素。
	distinct() //去重,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
	limit(long maxSize) //截断流,使其元素不超过给定数量。
	skip(long n)//跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit() 互补
2.映射
	map(Function f)	//接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
	flatMap(Function f)	//接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流.
	mapToDouble(ToDoubleFunction f)//接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 DoubleStream。
	mapToInt(ToIntFunction f)//接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 IntStream。
	mapToLong(ToLongFunction f)//接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 LongStream。
	
3.排序
	sorted()//产生一个新流,其中按自然顺序排序,元素实现Compareble接口
	sorted(Comparator comp)	//产生一个新流,其中按比较器顺序排序,传入一个比较器

4、Stream 的终止操作

注意:终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是 void 。
1.查找与匹配
	allMatch(Predicate p)//检查是否匹配所有元素,即有一个元素不匹配,则为false
	anyMatch(Predicate p)//检查是否至少匹配一个元素,即有一个匹配则返回true
	noneMatch(Predicate p)//检查是否没有匹配所有元素
	findFirst()	//返回第一个元素
	findAny()//返回当前流中的任意元素
	count()	//返回流中元素总数  
	max(Comparator c)//返回流中最大值 
	min(Comparator c)//返回流中最小值 
	forEach(Consumer c)	//内部迭代
2.归约
	reduce(T iden, BinaryOperator b) //参1是起始值, 参2二元运算,可以将流中元素反复结合起来,得到一个值,返回 T 。
	reduce(BinaryOperator b) //这个方法没有起始值,可以将流中元素反复结合起来,得到一个值。返回 Optional<T> 
	备注:map 和 reduce 的连接通常称为 map-reduce 模式,因 Google 用它来进行网络搜索而出名。
3.收集
	collect(Collector c)//将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
	Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、Set、Map)。
	Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例;
4.Collectors 中的方法
	List<T> toList()//把流中元素收集到List
	Set<T>  toSet()//把流中元素收集到Set
	Collection<T> toCollection()//把流中元素收集到创建的集合 
	例:把所有员工的名字通过map()方法提取出来之后,在放到指定的集合中去:
    Collection<Employee>emps=list.stream().map(提取名字).collect(Collectors.toCollection(ArrayList::new));
	Long counting()//计算流中元素的个数
	Integer	summingInt()//对流中元素的整数属性求和
	Double averagingInt()//计算流中元素Integer属性的平均值
	IntSummaryStatistics summarizingInt()//收集流中Integer属性的统计值。
		例子:DoubleSummaryStatistics dss= list.stream().collect(Collectors.summarizingDouble(Employee::getSalary));
		从DoubleSummaryStatistics 中可以获取最大值,平均值等
	double average = dss.getAverage();//平均值
	long count = dss.getCount();//个数
	double max = dss.getMax();//最大值
	String joining(String str) //使用str连接流中每个字符串
	Optional<T> maxBy() //根据比较器选择最大值
	Optional<T> minBy() //根据比较器选择最小值
	Map<K, List<T>> groupingBy() //根据某属性值对流分组
	Map<Boolean, List<T>> partitioningBy() //根据true或false进行分区
newman的使用 Newman是一个基于Node.js的postman命令行工具,用于运行和测试PostmanAPI 请求的集合。它允许用户在命令行环境中执行Postman的JSON文件,从而实现接口自动化测试和持续集成,同时支持用户进行自动化测试、批量执行请求、生成报告等操作。 阅读详情

相关推荐

Win11实时字幕还能这么玩?手把手教你打造专属‘AI字幕机’,告别视频网站无字幕困扰

本文详细介绍了如何利用Win11的实时字幕功能打造全平台通用的AI字幕系统。通过C#抓取程序、Node.js中转服务和前端展示界面的组合,实现自动抓取系统字幕并实时推送到任意网页视频的方案,有效解决在线视频无字幕的困扰。

weixin_33735077的博客 390

【Java常用工具类】线程安全的日期类

文章目录其他工具类【Java常用工具类】数学计算【Java常用工具类】字符串方法解释1、formatNowOfTimestamp,格式化当前时间为【年月日时分秒】,时间戳2、formatNowOfMin,格式化当前时间为【年-月-日 小时:分钟】3、formatNowOfSec,格式化当前时间为【年-月-日 小时:分钟:秒】4、formatNowOfHour,格式化当前时间为【年-月-日 小时】5、formatNowOfDay,格式化当前时间为【年-月-日】6、dateToLocalDate,data 转

自律使我自由 2475

OpenClaw安装方式那么多,但建议大家还是用云厂商吧

OpenCloud的安装方式多样,包括One-liner、npm、pnpm和Hackable等。One-liner提供高效的单行命令安装;npm和pnpm作为Node.js包管理工具,分别提供常规和高性能的安装选项;Hackable则支持定制化安装。不同系统(macOS、Windows)和终端(PowerShell、CMD)的操作步骤各有特点,用户需根据自身技术背景选择合适的安装方式。官方推荐使用闲置计算资源或云部署方案以获得更佳体验。

涛涛讲AI 1398

Java线程安全的时间类

你还在使用Date和Calendar吗,快换一下吧!

袁的博客 2304

UCIe物理层 —— 逻辑协议 (2)

本章开始主要介绍UCIe协议第四章,物理层逻辑定义和规范。如其他的通信协议一样,接口的物理层包含两个部分,逻辑子层和电气子层。其中逻辑层主要负责:1.定义接口信号和时序2. 定义发送端如何将上层数据分发到各个物理通道以及接收端如何把从各个通道收到的数据恢复成byte stream(Flit)。3. Broken Lane的repair和remap。4. 链路初始化,训练(training)和电源状态管理/切换。5. 扰码Scrambling和training sequence的产生。

m0_47581558的博客 1477

基于Matlab与Gurobi的园区微电网风光储协同规划:从独立运营到联合优化的建模实战

本文详细介绍了如何利用Matlab与Gurobi进行园区微电网的风光储协同规划建模实战。通过构建从独立运营到联合优化的数学模型,结合Yalmip工具箱,旨在解决源荷不匹配问题,实现储能系统的最优配置与运行,从而降低总供电成本并提升新能源利用率。

weixin_29053073的博客 140

线程安全的日期工具类

高并发情况下,SimpleDateFormat是线程不安全的,我们使用ThreadLocal解决线程安全问题。 日期模板枚举类PatternEnum public enum PatternEnum { //g global全称,cn中国 G_DATE_TIME_DEFAULT("yyyy-MM-dd HH:mm:ss"),// 默认的年月日时分秒格式 G...

李卫康的博客 2914

RYU+mininet——RYU

1. 使用RYU做mininet的控制器 1.1 RYU介绍与安装 RYU是一款基于python的控制器,你可用Ryu实现各种想要实现的网络功能,它可以下发或接收流表进行各种路由运算。 建议使用高版本的Ubuntu系统安装ryu,否则会有各种错误,安装过程比较简单,如下: apt install gcc libffi-dev libssl-dev libxml2-dev libxslt1-...

qq_34415266的博客 1万+

线程安全的日期API

Java 8 推出了全新的日期时间API 8之前Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。 新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。 类的名称 描述 Instant 时间戳 Duration 持续时间、时间差 LocalDate 只包含日期,比如:2020-01-01 LocalTime

liuerchong的博客 558

【学习笔记】人群归因分数 PAF 以及combined PAF

人群归因风险比例(Population Attributable Fraction,PAF)是一个流行病学指标,它估计了在总体中,如果能消除一个特定的危险因素,能预防多少百分比的疾病或健康结果。简单来说,PAF回答的是:“如果没有这个风险因素,总体中会有多少病例是可以避免的?

weixin_53499537的博客 4897

安全运营面试总结

答案可以在我的博客中查找 1.自我介绍 2.TCP/IP七层模式 3.端口号(常见协议 数据库) 4.Owasp top 10 5.渗透测试过程 6.漏扫工具 7.中间件漏洞 8.应急响应 9.项目 10.SQL注入类型 11.TCP 三次握手 四次挥手 12.你有什么要问我的 1.自我介绍 2.项目介绍 3.宽字节注入的原理 4.渗透流程 5....

qq_51577576的博客 4412

JDK1.8新特性(四):接口、线程安全的时间与注解

接口中的默认方法与静态方法线程安全的时间格式化SimpleDateFormat的多线程安全问题解决方案时间类时间戳时间与日期间隔时间校正器:TemporalAdjuster时间格式化:DateTimeFormatter时区处理注解重复注解类型注解 接口中的默认方法与静态方法 JDK1.8支持在接口中有默认方法与静态方法了,之前接口用只能有抽象方法和静态常量 default:修饰接口的默认实现(为了提高兼容性,假如一个接口增加了方法,那么实现类都需要去实现新增的方法,所以添加了默认实现,让以前的实现类不需.

GDUT_Trim的博客 936

46、大数据助力SDN优化流量管理与控制器

本文探讨了大数据在软件定义网络(SDN)中的应用,重点分析了如何利用大数据技术优化SDN控制器的可扩展性和弹性。通过介绍SDN控制器的核心功能及其面临的挑战,提出了集中式、分布式、混合式和分层式控制器放置策略,并结合大数据分析系统架构与技术,详细阐述了在控制器放置优化、流聚合和备份路径识别等场景中的实际应用。文章还给出了大数据分析在SDN控制器优化中的操作流程与优势,展望了未来结合人工智能与物联网的发展方向,强调了数据安全与算法效率的重要性。

xx56789的博客 85

JDK1.8新增的Stream的使用及原理

可以说函数式编程,Lambda 和 Stream 是JDK1.8新增的最有亮点的特性了。在学习Apache Flink 的时候,经常遇到算子运算,其实这就是一种最常用的Stream流编程运算,今天就来研究一下Java 的JDK1.8提供的Stream流式编程,以便对后续学习Flink和Spark还有Strom这些流式和批式处理框架有所帮助。 新的java.util.stream包...

leehsiao的专栏 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Lambda表达式与Stream流

Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。Collection是一种静态的内存数据结构,讲的是数据,主要面向内存,存储在内存中。Stream是有关计算的,讲的是计算,主要是面向 CPU,通过 CPU 实现计算。

2301_79561226的博客 1579

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Lambda表达式和Stream流

风吹起了从前,看着天边似在眼前,万般流连~

Wind的博客 1440

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jdk1.8 / 函数式接口 /Lambda表达式 /Stream流 笔记

通过接口,可以定义一组共同的方法,不同的类可以根据自身的需求来实现这些方法,实现了代码的灵活性和扩展性。总的来说,默认方法为Java接口带来了更大的灵活性和功能性,使得接口可以更好地适应需求的变化,同时提高了代码的复用性和可维护性。通过接口,一个类可以获得多个接口的特性,实现了类的多继承。:默认方法提供了一种在接口中实现通用逻辑的方式,这样实现类可以直接继承默认方法的实现,避免了重复编写相同的代码。:默认方法的引入为新的设计模式提供了可能性,例如接口的扩展、接口的组合等,使得代码结构更加灵活和易于维护。

qq_73277393的博客 1722

JDK8特性,Lambda,时间日期,接口增强,Optional,Stream流

jdk8引入了一个新的操作符 lambda操作符 ->操作符左侧:lambda参数列表,右侧:lambda函数体可以理解为可传递的匿名函数,即传递函数体并生成对象,可以简化匿名内部类的使用需要函数式接口的支持函数式接口:接口中只有一个抽象方法可以用@FunctionalInterface注解给接口做检查,如果接口有多个抽象方法,会语法报错Optional是工具类,没有任何子类Optional是一个可以为null的容器,保存null时表示值不存在。

给自己的程序生涯留下一点痕迹 2983

JDK 1.8新特性Lambda入门

网上关于java lambda的例子很多,但是这些五花八门的例子很不常见不常用,最后导致初学者望而却步,其实我们抓住lambda的本质之后,会发现lambda还是很好理解的。毕竟,java8设计lambda的初衷是给开发者提供便利,而不是制造障碍。 lambda表达式本质是匿名方法,下面是一些lambda表达式: (int x, int y) -> x + y () -> 42

记忆力不好的博客 2万+

JDK新特性(Lambda表达式,Stream流)

有且只有一个抽象方法的接口,用@FunctionalInterface去检测我们可以点击这个Comparator这个方法还有我们在线程章节经常用的Runnable接口这时候可能有人会想,Lambda表达式既然只能用函数式接口做为参数,那这个不是很鸡肋嘛难道我要自己去写一个接口,里面专门再只放一个抽象方法,那这不是更麻烦了嘛反正我刚刚学的时候,我确实是有这样的疑问后面问了GPT,其实这个lambda表达式大部分应该是和后面的Stream流一起使用的。

m0_73966521的博客 1485

JDK8中Lambda表达式用法及Stream流详解

Lambda表达式 详解

wounler的博客 1454

JDK1.8新特性之Stream流

目录 Stream流 传统办法对集合中的数据进行过滤 使用Stream对集合中的数据进行过滤 Stream流的思想 Stream流 之前我们学过I/O流,但实际上,谁规定流就一定是I/O流呢?Stream流用于解决已有集合类库的弊端。例如for循环的语法是怎么做,for循环的循环体是做什么。我们应该更加关注的是做什么,而不是怎么做。 传统办法对集合...

我能在河边钓一整天的鱼 2905

Java 8 新特性:Lambda 表达式与 Stream 流,重构你的编码效率(上篇:Lambda 表达式)

Java 8 引入的 Lambda 表达式和 Stream API 彻底革新了数据处理方式。Lambda 简化了函数式接口的使用,使代码更精炼;而 Stream 提供了强大的集合操作能力,支持函数式编程风格。本文将快速带领你掌握这两项特性,展示如何用更少的代码做更多的事情,提升开发效率和代码质量,让编程成为一门艺术。无论你是新手还是资深开发者,都将受益于这一现代 Java 编程之旅。

欢迎来到我的技术空间!我是一名经验丰富的Java开发工程师,热衷于分享我在软件开发领域的知识和心得。在这个博客里,您会发现一系列关于Java编程的文章,包括最佳实践、技术趋势、代码优化技巧以及一些有趣的项目案例。无论是初学者还是有经验的开发者,都能在这里找 1640

jdk8新特性-Lambda表达式与Stream流实战

这部分会详细的写jdk1.8新特性,lambda表达式的使用以及stream流的使用。

成都往右的博客 1417

Lambda表达式、Stream流—————面试必备

Lambda表达式 JDK8的新特性 1、Lambda表达式(函数式编程) 2、Stream流(Lambda的实际运行之一) 函数式编程思想概述 函数有输入量,计算过程,输出量(y=xx+2x+2),函数式编程思想,以一种尽量简单的格式,简化面向对象中复杂的格式,面向对象强调的是以何种形式去做,而函数式编程思想强调的是拿什么东西做什么事情,而不强调以何种形式去做。 冗余的Runnable代码体验 ...

等不到的晴天的博客 2246

Java8函数式编程(Lambda表达式,Stream流,Optional)

lambda表达式是Java8的一个新特性,从本质上来讲是一个匿名函数可以使用这个匿名函数实现接口中的方法,并且非常简洁。通常来讲,使用 lambda表达式 是为了。关于接口实现,可以有很多种方式来实现。例如L设计接口的实现类、使用匿名内部类。但是lambda表达式比这两种方式都简单。

qq_62767608的博客 4064
上一篇: Java反射机制:通过反射机制获取类的成员(构造方法,成员变量,成员方法);通过反射越过泛型检查;通过反射运行配置文件内容
下一篇: JS: 数据类型;运算符;函数;js内置对象;BOM;DOM;事件
y_Engineer
博客等级 码龄7年 42粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值