avatar
文章
360
标签
49
分类
10
首页
时间轴
分类
关于
Logo只有那年胜过年年
搜索
首页
时间轴
分类
关于

只有那年胜过年年

Java8 新特性之接口默认方法与静态方法
发表于2025-10-15|后端
接口默认方法与静态方法有这样一些场景,如果一个接口要添加一个方法,那所有的接口实现类都要去实现,而某些实现类根本就不需要实现这个方法也要写一个空实现,所以接口默认方法就是为了解决这个问题。 接口静态方法类似于默认方法,但是我们不能在实现类中覆盖它们,可以避免默认方法在实现类中被覆盖实现。 之前讲过的JDK8的list.foreache方法,看下源码,其实也是java.lang.Iterable接口的默认方法。 default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } 简单的例子默认方法以default修饰,静态方法用static。 public static void main(String[] args) { IUserInterface userInterface = new...
Java8 新特性之函数式接口
发表于2025-10-15|后端
什么是函数式接口先来看看传统的创建线程是怎么写的 Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("t1"); } }); t1.start(); 再来看看使用了函数式接口是怎么写的 Thread t2 = new Thread(() -> System.out.println("t2")); t2.start(); Runnable接口直接可以使用Lambda表达式来编写,这是因为Runnable接口是一个函数式接口,来看看Runnable的源码。 @FunctionalInterface public interface Runnable { public abstract void run(); } 发现该接口加上了函数式接口的定义注解:@FunctionalInterface,表明该接口...
Java8 新特性之方法引用
发表于2025-10-15|后端
什么是方法引用方法引用是只需要使用方法的名字,而具体调用交给函数式接口,需要和Lambda表达式配合使用。 如: List<String> list = Arrays.asList("a","b","c"); list.forEach(str -> System.out.print(str)); list.forEach(System.out::print); 上面两种写法是等价的。 方法引用分类1、构造器方法引用格式:Class::new,调用默认构造器。 2、类静态方法引用格式:Class::static_method 3、类普通方法引用格式:Class::method,方法不能带参数。 4、实例方法引用格式:instance::method 示例往User类添加方法引用方法: public static User create(Supplier<User> supplier){ return supplier.get(); } public stat...
Java8 新特性之重复注解
发表于2025-10-15|后端
什么是重复注解下面是JDK8中的重复注解(java.lang.annotation.Repeatable)定义的源码。 @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Repeatable { Class<? extends Annotation> value(); } 重复注解,即一个注解可以在一个类、方法或者字段上同时使用多次,如Spring中可以使用多个扫描组件来扫描多个包的注解。 @ComponentScan @ComponentScan public class Configuration{ } ComponentScan @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Repeatable(ComponentScans.class) pub...
Java 8 创建 Stream 的 10 种方式,我保证你受益无穷!
发表于2025-10-15|后端
今天来分享下在 Java 8 中创建 Stream 的 10 种方式,我就整理了 10 种,其实还有更多,仅供大家参考学习下。 1、Stream.of 可变参数Stream<String> stream1 = Stream.of("A", "B", "C"); System.out.println("stream1:" + stream1.collect(joining())); 程序输出: stream1:ABC 2、Stream.of 数组String[] values = new String[]{"A", "B", "C"}; Stream<String> stream2 = Stream.of(values); System.out.println("stream2:" + stream2.collect(joining())); ...
Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局!
发表于2025-10-15|后端
恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同学来说,都是一个知识盲点,因为这个原因,我才这么细致地讲解Stream流的各个知识点,通过这一整个系列,我相信只要认真看了的同学,都已掌握的差不多了,就差实战了。 其实我在工作过程中,Stream流对我的帮助真的挺大的,所以,我想和大家分享一下,于是这系列的文章就出来了。 在本系列文章发布的时候,有很多同学反映,Stream流的调试和forEach()的调试都不是特别友好,那本篇给出一个折中的调试方法,虽然不能完美解决调试的问题,但是基本上已经能解决绝大部分的调试问题了,没错,就是迭代器了,当然迭代器除了能辅助调试以外,他最重要的还是遍历功能。 这篇文章除了介绍传统的迭代器外,还会介绍Java8中新增的Spliterator,因为在并行流的场合,Spliterator相当的好用。 我们先简单介绍一下传统的迭代器迭代器是实现了Iterator接口的对象,并且Iterator接口允许遍历,获取或者移除元素。 public interface Iterator<E> ...
Java 8 新特性之 Stream 流(一)基础体验
发表于2025-10-15|后端
什么是流API? 它能做一些什么?我们应该知道(绝对知道~)API是一个程序向使用者提供的一些方法,通过这些方法就能实现某些功能。所以对于流API来说,重点是怎么理解”流”这个概念,所谓的流:就是数据的渠道,所以,流代表的是一个对象的序列它和Java I/O类里使用的”流”不同。虽然在概念上与java.util.stream中定义的流是类似的,但它们是不同的,流API中的流是描述某个流类型的对象。 流API中的流操作的数据源,是数组或者是集合。它本身是不存储数据的,只是移动数据,在移动过程中可能会对数据进行过滤,排序或者其它操作,但是,一般情况下(绝大数情况下),流操作本身不会修改数据源,比如,对流排序不会修改数据源的顺序。相反,它会创建一个新的流,其中包含排序后的结果。 从一个简单的例子,体验流API的强大与优雅这个简单的Demo,主要是对一个由1-6乱序组成的List对应的流进行操作,然后通过这个流,就可以获取到列表里面最大最小值、排序、过滤某些元素等等的操作。并且这此操作不会改变原List里面的数据。Demo里面需要注意的地方就是流API里面的”终端操作”和”中间...
Java 8 新特性之 Stream 流(三)缩减操作
发表于2025-10-15|后端
和前面两篇文章一起服用,效果会更佳。通过对流API的基础体验Demo和关键知识点的讲解,相信大家对流API都有一定的认识了,但是流API强大的功能,可不仅仅像前面两篇文章中说的那样简单,大家应该注意到,在第二篇中,我对Stream接口进行介绍的时候,并没有把他的全部方法都进行了解析说明。没错,从这一篇开始,那些还没有讲解的方法,很可能就开始变成我们的主角了,大家从题目上面应该知道了,本期我们要讲的是流API的缩减操作。 何为缩减操作?我们先考虑一下min()和max(),这两个方法我们在第一篇和第二篇中均有提到,其中min()是返回流中的最小值,而max()返回流中最大值,前提是他们存在。他们之间的特点是什么?①都返回了一个值②由一可知,他们是终端操作。如果我们用流API的术语来形容前面这两种特性的结合体的话,它们代表了缩减操作。因为每个缩减操作都把一个流缩减为一个值,好比最大值,最小值。当然流API,把min()和max(),count()这些操作称为特例缩减。即然说到了特例,肯定就有泛化这种概念了,他就是reduce()方法了,其实第二篇当中,他已经出现过了,只是当时我没有去...
Java 8 新特性之 Stream 流(二)关键知识点
发表于2025-10-15|后端
我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉。如果你没有实践,我还是再次呼吁你动手敲一敲,自己实实在跑一遍上一篇的Demo。相信你的感受和理解也会随之加深的。继续探索流API的高级功能之前,我们先从接口级别全面了解一下流API,这个对于我们来说是至关重要的。接下来,我给大家准备了一张流API关键知识点的UML图。但是大家只需要花一两分钟,整理看一下就可以了,不需要记住,先有个印象,后面我给大家讲解一些关键的方法: 流API UML 我先整体介绍一下:流API定义的几个接口,都是在java.util.stream包中的.其中上图中的BaseStream接口是最基础的接口,它提供了所有流都可以使用的基本功能: public interface BaseStream<T, S extends BaseStream<T, S>> extends AutoCloseable { //....先忽略这些具体的细节 } 由这个接口的定义我们得知,BaseStream是一个泛型接口,它...
Java 8 新特性之 Stream 流(五)映射
发表于2025-10-15|后端
经过了前面四篇文章的学习,相信大家对Stream流已经是相当的熟悉了,同时也掌握了一些高级功能了,如果你之前有阅读过集合框架的基石Collection接口,是不是在经过前面的学习,以前看不懂的东西,突然之间就恍然大悟了呢? 今天我们的主角是Stream流里面的映射。由于之前,映射并没有再我们的Demo,例子中出现过,所以对大家来说可能会稍微有一点点陌生的,但通过这一篇文章,我相信能解决你的疑问。 在正式开始之前,我和大家继续说说流API操作,不知道大家有没有注意到,其实我们所有的流API操作都是针对流中的元素进行的,并且都是基于同一流里面的,大家有没有这样的疑问,怎么样把一个流的元素弄到另一个流里面呢?怎么把流中的一些满足条件的元素放到一个新流里面呢? 通过这一节,你将会掌握解决刚才问题的本领。另外再提一点,如果流操作只有中间操作,没有终端操作,那么这些中间操作是不会执行的,换句话说,只有终端操作才能触发中间操作的运行。 我们为什么需要映射?因为在很多时候,将一个流的元素映射到另一个流对我们是非常有帮助的。比如有一个包含有名字,手机号码和钱的数据库构成的流,可能你只想要映射钱这个...
1…313233…36
avatar
2025
文章
360
标签
49
分类
10
公告
🌸 春去秋来,花开花落 📚 桌上的日历又薄了几页 💭 记忆中的昨天还那么清晰
最新文章
掌握 Spring 框架这 10 个扩展点,开发效率直接翻倍2025-11-10
Minikube安装教程2025-11-07
Deepseek 本地部署各个版本超级详细教学,网页版、软件版2025-11-04
Slow HTTP POST 慢速攻击2025-10-30
JDK 紧急漏洞,XMLDecoder反序列化攻击2025-10-30
分类
  • 其他3
  • 区块链4
  • 后端225
  • 安全漏洞3
  • 工具30
  • 性能4
  • 教程1
  • 数据库21
  • 架构15
  • 程序人生54
标签
文章LinuxJVM分布式技术其他区块链基础安全漏洞多线程性能优化新特性架构算法程序人生行业动态规范资料集合进阶面试Elastic JobdockerJWTDubboMyBatisNettyShiroSpringSpring MVCSpring CloudTomcatSpring BootZookeeper日志开源综合技术消息队列缓存连接池Eclipse
归档
  • 2025年11月 3
  • 2025年10月 355
  • 2025年09月 1
  • 2024年12月 1
网站信息
文章数目 :
360
本站访客数 :
本站总浏览量 :
最后更新时间 :
访客地图
© 2025 By 2025
搜索
数据加载中