推陈换新系列————java8新特性(编程语言的文艺复兴)
文章目录
- 前言
- 一、新特性秘籍
- 二、Lambda表达式
- 2.1 语法
- 2.2 函数式接口
- 2.3 内置函数式接口
- 2.4 方法引用和构造器引用
- 三、Stream API
- 3.1 基本概念
- 3.2 实战
- 3.3 优势
- 四、新的日期时间API
- 4.1 核心概念与设计原则
- 4.2 核心类详解
- 4.2.1 LocalDate(本地日期)
- 4.2.2 LocalTime(本地时间)
- 4.2.3 LocalDateTime(本地日期时间)
- 4.2.4 ZonedDateTime(带时区的日期时间)
- 4.2.5 Instant(瞬时点)
- 4.3 时间间隔与周期
- 4.3.1 Duration(持续时间)
- 4.3.2 Period(日期间隔)
- 4.4 时间调整器(TemporalAdjuster)
- 4.5 总结
- 五、optional类
- 5.1 概念
- 5.2 创建实例
- 5.3 常用的方法
- 5.4 实战
- 5.5 最佳实践
- 六、接口中默认方法和静态方法
- 献给读者
前言
想象一下,Java世界迎来了一场盛大的革命——Java 8隆重登场。这次更新不仅仅是技术上的进步,更是一场编程思维的转变,让开发者们仿佛从黑白电视时代一步跨入了4K超高清智能电视的新纪元。
首先,不得不提的是Lambda表达式,这是Java 8送给程序员的一份大礼。以往编写代码时,我们总是被繁琐的匿名内部类所困扰,而Lambda表达式的出现就像是给这段枯燥的旅程中注入了一股清泉。它让你能够以一种更加简洁、直观的方式操作数据和定义行为,就像在画布上用寥寥几笔勾勒出一幅生动的画卷。函数式接口则像是为这场表演搭建了一个舞台,让Lambda表达式可以在这个舞台上自由舞蹈。
接着是Stream API,它为处理集合提供了一种全新的方式。如果你曾经为了遍历一个列表并从中筛选出符合条件的元素而绞尽脑汁,那么现在只需要几行优雅的代码就能搞定这一切。Stream API就像是一个魔法棒,轻轻一点就能将你的数据转换成你想要的样子,无论是过滤、排序还是聚合,一切都变得轻而易举。
再来看看新的日期和时间API(java.time包),这简直是对旧版日期处理机制的一次彻底颠覆。曾经那些关于日期计算的噩梦,在这里都能找到简单而有效的解决方案。这个新API提供了强大的功能来处理瞬时点、时间段以及不同地区的日期和时间,使得即使是处理复杂的国际化应用也能游刃有余。
还有那令人兴奋的Optional类,它就像是一个贴心的小助手,帮助我们避免了空指针异常这个长久以来的敌人。通过使用Optional,我们可以明确地表示某个值可能存在也可能不存在的情况,从而写出更加健壮且易于理解的代码。
最后,不要忘了Java 8对注解的支持也得到了加强。重复注解和类型注解的引入,让我们的代码不仅能够传达更多的信息,同时也变得更加灵活。这就像是给你的工具箱里添加了几把多功能的瑞士军刀,无论遇到什么样的挑战,都能够从容应对。
一、新特性秘籍
Java 8的新特性,犹如一场编程语言的文艺复兴,开启了代码优雅与效率并存的新篇章。
- Lambda表达式,是将行为抽象为艺术的画笔,用简洁的线条勾勒出逻辑的本质。
- Stream API,则是数据流动的诗意,让集合操作如溪流般自然流畅,汇聚、过滤、映射一气呵成。
- 新的日期时间API,如同精准的钟表匠,拨开了旧版日期处理的迷雾,赋予时间运算以秩序与美感。
- Optional类,宛如一位守护者,用温柔的方式提醒我们关注可能的空值陷阱,让代码多了一份从容与稳健。
- 接口中的默认方法与静态方法,仿佛给传统接口注入了灵魂,使其既能传承经典,又能灵活扩展。
- 方法引用,则是对已有实现的致敬,通过简短的符号唤醒隐藏在代码深处的力量。
💡贴士:这一切,正如递归是探索自我重复的奇妙之旅,Java 8的新特性,则是引领开发者迈向简洁、优雅与高效的全新境界。
二、Lambda表达式
Lambda表达式是Java 8引入的一个重要特性,它为Java语言带来了函数式编程的能力。Lambda表达式允许你将行为作为参数传递给方法或存储为变量,简化了代码结构,使得编写更加简洁、清晰的代码成为可能。Lambda表达式是一个匿名函数,使用lambda表达式使代码更加简洁紧凑。
2.1 语法
- 基本语法格式如下:
(parameters) -> expression
- 或者对于需要多行语句的情况:
(parameters) -> { statements; }
这里,parameters
是参数列表,->符号用来分隔参数列表和Lambda
体,expression
或statements
构成了Lambda
体,即你要执行的操作。
假设我们有一个简单的例子,使用传统方式定义一个线程:
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Running in a thread");}
}).start();
使用Lambda表达式可以简化为:
new Thread(() -> System.out.println("Running in a thread")).start();
可以看到,使用Lambda表达式不仅减少了冗余代码,而且使代码意图更加明确。
2.2 函数式接口
Lambda
表达式只能用于上下文为目标类型是“函数式接口”的地方。函数式接口是指仅包含一个抽象方法的接口(虽然可以有多个默认方法和静态方法)。为了方便识别,Java 8提供了@FunctionalInterface
注解来标注这样的接口,但即使不加此注解,只要接口满足条件,就可以与Lambda表达式一起使用。
例如,Runnable
接口就是一个函数式接口,因为它只定义了一个run()
方法。
2.3 内置函数式接口
查看详细的内置函数👉👉👉 点我
查看详细的内置函数👉👉👉 点我
查看详细的内置函数👉👉👉 点我
Java 8在java.util.function包中提供了一系列通用的函数式接口,包括但不限于:
- Predicate:接受一个参数,返回一个布尔值。
- Function<T, R>:接受一个参数,返回一个结果。
- Consumer:接受一个参数,没有返回值。
- Supplier:不接受任何参数,返回一个结果。
- BinaryOperator:接受两个同类型的参数,返回相同类型的结果。
💡贴士:这些内置接口极大地提高了Lambda表达式的灵活性和适用性。
2.4 方法引用和构造器引用
Lambda表达式还支持方法引用和构造器引用,进一步增强了其表现力。方法引用通过::操作符实现,可以直接引用已有方法或构造器。例如,String
类的compareTo
方法可以通过方法引用来使用:
Arrays.sort(strArray, String::compareTo);
这表示使用String
类的compareTo
方法对strArray
数组进行排序。
三、Stream API
Java 8引入的Stream API(流)为处理集合提供了强大的功能,使得对数据的操作更加简洁和高效。Stream是一个从支持数据处理操作的源生成的元素序列,这些操作包括过滤、排序、映射等。Stream API的设计灵感来源于函数式编程语言中的概念,它允许开发者以声明式的方式定义数据处理管道。
查看详细的Stream API
👉👉👉 点我
查看详细的Stream API
👉👉👉 点我
查看详细的Stream API
👉👉👉 点我
3.1 基本概念
- 流(Stream):是从支持数据处理操作的源生成的元素序列。流本身并不存储数据,而是通过一系列中间操作来描述计算过程,最终由终端操作触发计算并产生结果。
- 源(Source):提供流的数据来源,如集合、数组或I/O资源。
- 中间操作(Intermediate Operations):返回一个新的流,允许进行链式调用。常见的有filter, map, sorted等。
- 终端操作(Terminal Operation):触发流的执行,并产生一个结果或副作用。常见的有forEach, collect, reduce等。
3.2 实战
- 创建流
可以从集合、数组等创建流:
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();
- 中间操作
- 过滤(Filter): 根据给定的条件筛选元素。
stream.filter(s -> s.startsWith("a"));
- 映射(Map): 将元素转换为其他形式或提取信息。
stream.map(String::toUpperCase);
- 排序(Sorted): 对流中的元素进行排序。
stream.sorted();
- 终端操作
- 遍历(ForEach): 对每个元素执行某个动作。、
stream.forEach(System.out::println);
- 收集(Collect): 将流中的元素收集成集合或其他形式。
List<String> resultList = stream.collect(Collectors.toList());
- 归约(Reduce): 将流中的元素组合成一个单一的结果。
Optional<String> result = stream.reduce((s1, s2) -> s1 + "," + s2);
- 并行流
Stream API还支持并行流,可以轻松实现并行处理:
List<String> list = Arrays.asList("apple", "banana", "orange");
list.parallelStream().forEach(System.out::println);
💡贴士:使用并行流时需要注意线程安全问题,特别是在修改共享状态的情况下。
3.3 优势
- 惰性求值:中间操作不会立即执行,只有当遇到终端操作时才会真正开始处理。
- 内部迭代:与传统的外部迭代相比,Stream采用内部迭代,使得代码更加简洁。
- 易于并行:通过简单的API即可实现并行处理,提高程序性能。
💡贴士:StreamAPI极大地简化了对集合数据的操作,让编写清晰、高效的代码变得更加容易。无论是进行复杂的数据分析还是简单的查询操作,StreamAPI都能提供灵活且强大的支持。
四、新的日期时间API
Java 8引入了全新的日期和时间API(java.time包及其子包),以解决旧版日期时间API(如java.util.Date和java.util.Calendar)存在的问题,例如非线程安全、设计不佳和时区处理困难。新的API不仅线程安全,还提供了更直观、更强大的功能,满足了现代应用对日期和时间处理的需求。
4.1 核心概念与设计原则
-
不可变性:
所有日期和时间类都是不可变的(Immutable
),一旦创建就无法修改。这使得它们天然适合多线程环境。 -
清晰的职责划分:
LocalDate
:仅表示日期(年月日),无时区信息。
LocalTime
:仅表示时间(小时分钟秒),无时区信息。
LocalDateTime
:结合日期和时间,无时区信息。
ZonedDateTime
:包含日期、时间和时区信息。
Instant
:表示时间线上的一个瞬时点(UTC时间戳)。 -
ISO标准:
遵循ISO 8601国际标准,日期格式为yyyy-MM-dd,时间格式为HH:mm:ss。
4.2 核心类详解
4.2.1 LocalDate(本地日期)
用于表示不带时区的日期,例如2025-03-26。
- 常用方法:
LocalDate.now()
:获取当前日期。LocalDate.of(year, month, day)
:创建指定日期。plusDays(long daysToAdd)
:增加天数。minusDays(long daysToSubtract)
:减少天数。isBefore(LocalDate other)
:判断是否在某个日期之前。isAfter(LocalDate other)
:判断是否在某个日期之后。
LocalDate today = LocalDate.now();
System.out.println("今天是:" + today);LocalDate birthday = LocalDate.of(1998, 1, 6);
System.out.println("生日是:" + birthday);LocalDate tomorrow = today.plusDays(1);
System.out.println("明天是:" + tomorrow);
4.2.2 LocalTime(本地时间)
用于表示不带时区的时间,例如21:41:30。
- 常用方法:
LocalTime.now()
:获取当前时间。LocalTime.of(hour, minute, second)
:创建指定时间。plusHours(long hoursToAdd)
:增加小时数。minusMinutes(long minutesToSubtract)
:减少分钟数。isBefore(LocalTime other)
:判断是否在某个时间之前。
LocalTime nowTime = LocalTime.now();
System.out.println("当前时间是:" + nowTime);LocalTime specificTime = LocalTime.of(14, 30, 45);
System.out.println("指定时间是:" + specificTime);LocalTime laterTime = nowTime.plusHours(2);
System.out.println("两小时后的时间是:" + laterTime);
4.2.3 LocalDateTime(本地日期时间)
用于表示不带时区的日期和时间,例如2025-03-26T21:41:30。
- 常用方法:
LocalDateTime.now()
:获取当前日期时间。LocalDateTime.of(year, month, day, hour, minute, second)
:创建指定日期时间。plusDays(long daysToAdd)
:增加天数。minusHours(long hoursToSubtract)
:减少小时数。
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("当前日期时间是:" + currentDateTime);LocalDateTime specificDateTime = LocalDateTime.of(2025, 3, 26, 21, 41, 30);
System.out.println("指定日期时间是:" + specificDateTime);LocalDateTime nextWeek = currentDateTime.plusDays(7);
System.out.println("一周后的日期时间是:" + nextWeek);
4.2.4 ZonedDateTime(带时区的日期时间)
用于表示带时区的日期和时间,例如2025-03-26T21:41:30+08:00[Asia/Shanghai]。
- 常用方法:
- ZonedDateTime.now(ZoneId zone):获取指定时区的当前日期时间。
- withZoneSameInstant(ZoneId zone):转换到另一个时区的相同时刻。
ZonedDateTime nowInShanghai = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println("上海当前日期时间是:" + nowInShanghai);ZonedDateTime nowInNewYork = nowInShanghai.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("纽约当前日期时间是:" + nowInNewYork);
4.2.5 Instant(瞬时点)
用于表示时间线上的一个瞬时点(UTC时间戳),通常用于记录事件发生的时间或进行时间计算。
- 常用方法:
- Instant.now():获取当前瞬时点。
- Duration.between(Instant start, Instant end):计算两个瞬时点之间的时间差。
Instant now = Instant.now();
System.out.println("当前瞬时点是:" + now);Instant oneHourLater = now.plus(Duration.ofHours(1));
System.out.println("一小时后的瞬时点是:" + oneHourLater);Duration duration = Duration.between(now, oneHourLater);
System.out.println("时间差是:" + duration.toMillis() + " 毫秒");
4.3 时间间隔与周期
4.3.1 Duration(持续时间)
用于表示两个瞬时点之间的时间间隔,适用于秒和纳秒级别的时间计算。
Duration duration = Duration.ofHours(2);
System.out.println("持续时间为:" + duration.toMinutes() + " 分钟");
4.3.2 Period(日期间隔)
用于表示两个日期之间的间隔,适用于年、月、日级别的时间计算。
LocalDate startDate = LocalDate.of(2024, 1, 1);
LocalDate endDate = LocalDate.of(2025, 3, 26);Period period = Period.between(startDate, endDate);
System.out.println("间隔为:" + period.getYears() + " 年 " + period.getMonths() + " 月 " + period.getDays() + " 天");
4.4 时间调整器(TemporalAdjuster)
用于执行复杂的日期调整操作,例如“本月的第一个周一”或“下个月的最后一天”。
LocalDate today = LocalDate.now();
LocalDate firstMondayOfMonth = today.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
System.out.println("本月的第一个周一是:" + firstMondayOfMonth);
4.5 总结
Java 8的新日期时间API解决了旧版API的诸多问题,提供了更加现代化、易用的功能。无论是简单的日期操作还是复杂的时区处理,它都能轻松胜任。以下是使用新API的一些最佳实践:
- 尽量避免直接操作原始类型(如int),而使用LocalDate、LocalTime等专用类。
- 在需要精确时间计算时,优先使用Duration和Period。
- 使用ZonedDateTime和ZoneId处理跨时区的应用场景。
通过这些改进,Java 8让日期和时间的处理变得更加优雅和高效!
五、optional类
Optional是Java 8引入的一个容器类,旨在优雅地处理可能为null的值,避免潜在的NullPointerException。它鼓励开发者显式处理可能缺失的值,而不是依赖于null检查,从而编写出更清晰、更健壮的代码。
5.1 概念
核心概念
- 存在性:Optional对象可以包含一个非空值(通过isPresent()方法判断)或为空(即不包含任何值)。
- 不可变性:一旦创建了Optional实例,就不能更改其内部的值。
- 避免强制解包:与原始类型的包装类型不同,Optional设计来避免直接调用.get()获取值前没有进行null检查的情况。
5.2 创建实例
有几种方式可以创建Optional实例:
- Optional.of(value):当确定value不是null时使用。如果传入null,会抛出NullPointerException。
- Optional.ofNullable(value):允许传入null值。如果传入的是null,则返回一个空的Optional实例。
- Optional.empty():创建一个空的Optional实例。
5.3 常用的方法
- isPresent():如果Optional包含值,则返回true。
- ifPresent(Consumer<? super T> consumer):如果有值,则对其执行提供的Consumer操作,否则不执行任何操作。这通常用于对存在的值执行某些操作而不需要显式的null检查。
- get():如果Optional包含值,则返回该值;如果没有值,则抛出NoSuchElementException。建议在调用此方法之前先检查是否有值存在。
- orElse(T other):如果存在值则返回该值,否则返回指定的默认值。
- orElseGet(Supplier<? extends T> supplier):功能类似于orElse,但它接受一个提供者函数,只有在需要时才计算默认值。
- orElseThrow(Supplier<? extends X> exceptionSupplier):如果存在值,则返回该值;否则抛出由提供的异常供应商生成的异常。
5.4 实战
使用of和get
Optional<String> optionalValue = Optional.of("Hello, World!");
System.out.println(optionalValue.get()); // 输出: Hello, World!
使用ofNullable处理可能为null的情况
Optional<String> optionalNull = Optional.ofNullable(null);
System.out.println(optionalNull.isPresent()); // 输出: false
使用ifPresent执行操作
optionalValue.ifPresent(value -> System.out.println("Value is present: " + value));
// 如果optionalValue有值,则输出: Value is present: Hello, World!
提供默认值
String defaultValue = optionalNull.orElse("Default Value");
System.out.println(defaultValue); // 输出: Default Value
5.5 最佳实践
- 避免过度使用Optional作为方法参数或字段类型,它更适合用于返回类型以表示可能存在也可能不存在的返回值。
- 不要将Optional用于集合或数组类型的封装,因为这些类型本身已经提供了表达“无元素”的机制(如空集合或空数组)。
- 在适当的情况下,优先考虑使用ifPresent、orElse等方法,而不是直接调用get(),这样可以减少运行时错误的风险。
💡贴士: 通过合理使用Optional,可以使代码更加清晰地表达意图,并有效减少因未处理null值而导致的错误。
六、接口中默认方法和静态方法
Java 8引入了对接口的重要增强,允许在接口中定义默认方法(default methods)和静态方法(static methods)。这些特性为接口添加了新的维度,使得它们不仅仅是抽象规范的集合,还可以包含具体的实现逻辑。这不仅简化了API的设计和演化,还为现有接口提供了向后兼容的方式进行扩展。
默认方法
默认方法允许你在接口中提供一个具体的方法实现。这意味着即使实现类没有提供该方法的具体实现,也可以使用接口中提供的默认实现。这对于库的设计者来说特别有用,因为他们可以在不破坏现有实现类的情况下向接口添加新功能。
定义默认方法
默认方法通过使用default关键字来定义:
public interface MyInterface {// 抽象方法void abstractMethod();// 默认方法default void defaultMethod() {System.out.println("This is a default method.");}
}
使用默认方法
当一个类实现了包含默认方法的接口时,它可以:
- 直接使用接口中的默认方法。
- 覆盖默认方法以提供自己的实现。
例如:
public class MyClass implements MyInterface {@Overridepublic void abstractMethod() {System.out.println("MyClass's implementation of abstractMethod");}// 可选:覆盖默认方法@Overridepublic void defaultMethod() {System.out.println("MyClass's implementation of defaultMethod");}
}
静态方法
静态方法是另一个Java 8为接口新增的功能。它们类似于普通类中的静态方法,可以通过接口名直接调用。静态方法主要用于提供与接口相关的工具函数或辅助函数。
定义静态方法
静态方法通过使用static关键字来定义:
public interface MyInterface {static void staticMethod() {System.out.println("This is a static method.");}
}
使用静态方法
MyInterface.staticMethod(); // 输出: This is a static method.
解决冲突
当一个类实现多个接口,而这些接口包含了相同签名的默认方法时,会发生方法冲突。解决这种冲突有几种方式:
- 类优先:如果实现类提供了该方法的具体实现,则使用类中的实现。
- 明确指定:如果需要使用某个特定接口的默认实现,可以通过InterfaceName.super.methodName()的方式来调用。
例如:
public interface InterfaceA {default void myMethod() {System.out.println("InterfaceA's default method");}
}public interface InterfaceB {default void myMethod() {System.out.println("InterfaceB's default method");}
}public class MyClass implements InterfaceA, InterfaceB {@Overridepublic void myMethod() {InterfaceA.super.myMethod(); // 调用InterfaceA的默认方法}
}
💡贴士:Java 8通过引入默认方法和静态方法极大地增强了接口的功能性,使接口能够更好地适应现代编程的需求。这些改进有助于减少样板代码,同时保持向后兼容性。
献给读者
💯 计算机技术的世界浩瀚无垠,充满了无限的可能性和挑战,它不仅是代码与算法的交织,更是梦想与现实的桥梁。无论前方的道路多么崎岖不平,希望你始终能保持那份初心,专注于技术的探索与创新,用每一次的努力和进步书写属于自己的辉煌篇章。
🏰在这个快速发展的数字时代,愿我们都能成为推动科技前行的中坚力量,不忘为何出发,牢记心中那份对技术执着追求的热情。继续前行吧,未来属于那些为之努力奋斗的人们。
亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌
相关文章:
推陈换新系列————java8新特性(编程语言的文艺复兴)
文章目录 前言一、新特性秘籍二、Lambda表达式2.1 语法2.2 函数式接口2.3 内置函数式接口2.4 方法引用和构造器引用 三、Stream API3.1 基本概念3.2 实战3.3 优势 四、新的日期时间API4.1 核心概念与设计原则4.2 核心类详解4.2.1 LocalDate(本地日期)4.2…...
蓝桥杯算法实战分享
蓝桥杯算法实战分享 蓝桥杯是国内知名的程序设计竞赛,涵盖算法、数据结构、编程技巧等多个领域。本文将从实战角度分享蓝桥杯算法竞赛的常见题型、解题思路和优化技巧,帮助参赛者更好地备战。 1. 常见题型与解题思路 蓝桥杯的题型主要包括以下几类&…...
树莓集团园区运营案例:成都国际数字影像产业园的运营逻辑
成都国际数字影像产业园的成功运营,是树莓集团在产业园运营领域的典型案例。其运营逻辑可以归纳为以下几点: 一、政企合作,优势互补 园区由树莓集团与金牛区政府合作共建,这种模式充分利用双方的优势。政府提供政策支持、土地资…...
【动态规划】最长公共子序列问题 C++
问题描述 子序列:序列Z是原序列X的子序列,当且仅当Z的元素在X中按严格递增的下标顺序出现(不要求连续)。例如X{A,B,C,B,D,A,B}中,Z{B,C,D,B}是子序列,对应X的下标2→3→5→7。公共子序列:若序列…...
K8s故障排查手册:从Pod崩溃到网络不通
本文基于数百个真实生产环境案例,系统化梳理Kubernetes集群的故障排查方法论。涵盖Pod生命周期异常、服务发现失效、存储卷挂载失败、网络策略冲突等核心故障场景,结合Prometheus监控指标、eBPF深度追踪、CNI插件分析等技术手段,为企业运维团…...
HTML DOM 基础:用「家族树」理解网页操控术
HTML DOM 基础:用「家族树」理解网页操控术 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model),也就是DOM。 DOM 是JavaScript 操作网页的接口,它的作用是将网页转为一个JavaScript 对象,从而可以用脚本进行各种操作(比如对元素增删内容)。 浏览…...
扩展卡尔曼滤波
1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统,扩展卡尔曼滤波 则扩展到了非线性系统,核心原理就是将非线性系统线性化,主要用的的知识点是 泰勒展开(我另外一篇文章的链接),如下是泰勒展开的公式…...
【AI News | 20250326】每日AI进展
AI News 1、Gemini 2.5:谷歌DeepMind最智能AI模型亮相 谷歌DeepMind推出Gemini 2.5,其最智能AI模型。首款实验版本Gemini 2.5 Pro在多项基准测试中领先,登顶LMArena榜首,展现卓越的推理与编码能力。该模型为“思考模型”…...
智能汽车图像及视频处理方案,支持视频星轨拍摄能力
美摄科技作为智能汽车图像及视频处理领域的先行者,正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案,一个集高效性、智能化、画质增强于一体的创新解决方案,旨在重塑智能汽车图像画质的新标准,并支持前…...
AI-Sphere-Butler之Ubuntu服务器如何部署Nginx代理,并将HTTP升级成HTTPS,用于移动设备访问
环境: AI-Sphere-Butler WSL2 Ubuntu22.04 Nginx 问题描述: AI-Sphere-Butler之Ubuntu服务器如何部署Nginx代理,并将HTTP升级成HTTPS,用于移动设备访问 解决方案: 一、生成加密证书 1.配置OpenSSL生成本地不加…...
SpringBoot项目图片上传成功,访问404
1. 配置文件,静态资源访问路径,记得加上file: 2.上传文件路径 以上配置是正确的,这样才可以正确映射 之前我再配置文件写的是,这是错的, 因为:classpath写法和绝对路径无法匹配 .addResourceLocations("classpat…...
鸿蒙学习笔记(2)-国际化配置、ArkTS简述
一、国际化配置 根据操作系统语言实现手动或者自动切换中英文,提供了多套语言包。编写过程中注意不要将文字写死,将文本放在指定的语言包文件夹中来保存,鸿蒙开发中默认实现中英文的国际化配置。若要实现中英文转化,需要在三个地…...
ES 字段的映射定义了字段的类型及其行为
在 Elasticsearch 中,字段的映射定义了字段的类型及其行为。你提供的 content_answer 字段映射如下: Json 深色版本 "content_answer": { "type": "text", "fields": { "keyword": { …...
游戏引擎学习第183天
回顾和今天的计划 我对接下来的进展感到非常兴奋。虽然我们可能会遇到一些问题,但昨天我们差不多完成了将所有内容迁移到新的日志系统的工作,我们正在把一些内容整合进来,甚至是之前通过不同方式记录时间戳的旧平台层部分,现在也…...
未来二十年的量子计算
在未来二十年间,量子计算领域将迎来翻天覆地的变革,从实验室走向更广阔的应用舞台,重塑众多行业的格局。 在硬件层面,量子芯片的研发将持续精进。超导量子比特技术会不断突破,进一步提升比特数量与质量。当前ÿ…...
SpringBoot通过Map实现天然的策略模式
😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: SpringBoot通过Map实现天然的策略模式 ⏱️ 创作时间: 202…...
MTKAndroid12 解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题
解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题 文章目录 场景参考资料修改文件解决方案日志源码分析 总结 场景 在部分产品中偶发性发现, SystemUI下拉框下拉后长按WIFI图标会导致崩溃问题,有时候是截屏、点击Home 按键后,长…...
Springboot 学习 之 Shardingsphere 按照日期水平分表(二)
文章目录 业务场景依赖配置特别注意优劣参考资料 业务场景 在 报表 等 大数据量 且需要 按照日期显示 的业务场景下,按照 日期水平分表 是一个不错的选择 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-b…...
WordPress超级菜单插件UberMenu v3.78汉化版
一、插件介绍 UberMenu 是一款功能强大的 WordPress 超级菜单插件,能够帮助站长创建响应式、可自定义的多级菜单。该插件支持动态内容加载、图标、图片、搜索框等丰富功能,并且兼容大多数 WordPress 主题。 UberMenu v3.78 经过完整汉化,适用于中文站点用户,让操作更加直观…...
观成科技:海莲花利用MST投递远控木马
概述 “海莲花”,又名“OceanLotus”,该APT组织是长期针对中国境内,且攻击活动十分活跃的组织。近期发现该组织使用了MSI文件滥用的新手法,将远程控制木马植入MST文件来修改MSI文件安装时的执行流程,在安装期间运行恶…...
Node.js系列(5)--数据库操作指南
Node.js数据库操作指南 💾 引言 数据库操作是Node.js应用开发中的关键环节。本文将深入探讨Node.js数据库操作的实现方案,包括连接管理、查询优化、事务处理等方面,帮助开发者构建高效可靠的数据访问层。 数据库操作概述 Node.js数据库操…...
最大异或对 The XOR Largest Pair
题目来自洛谷网站: 思路: 两个循环时间复杂度太高了,会超时。 我们可以先将读入的数字,插入到字典树中,从高位到低位。对每个数查询的时候,题目要求是最大的异或对,所以我们选择相反的路径&am…...
简单介绍My—Batis
1.什么是My—Batis? My—Batis是一个持久层框架,提供了sql映射功能,能方便的将数据库表和java对象进行映射,通过My—Batis可以将项目中的数据存储在数据库中,以便我们进行调用。值得注意的是My—Batis和spring不是一回…...
案例分享|树莓派媒体播放器,重构商场广告的“黄金三秒”
研究显示,与传统户外广告相比,数字户外广告在消费者心中的记忆率提高了17%,而动态户外广告更是能提升16%的销售业绩,整体广告效率提升了17%。这一显著优势,使得越来越多资源和技术流入数字广告行业。 户外裸眼3D广告 无…...
硬件基础(5):(3)二极管的应用
文章目录 [toc]1. **整流电路****功能**:**工作原理**:**应用实例**:电路组成:整流过程:电路的应用: 2. **稳压电路****功能**:**工作原理**:**应用实例**:电路组成及功能…...
数据结构之栈的2种实现方式(顺序栈+链栈,附带C语言完整实现源码)
对于逻辑关系为“一对一”的数据,除了用顺序表和链表存储外,还可以用栈结构存储。 栈是一种“特殊”的线性存储结构,它的特殊之处体现在以下两个地方: 1、元素进栈和出栈的操作只能从一端完成,另一端是封闭的…...
vscode终端不识别npm 无法解析npm
vscode 用以管理员打开识别npm vscode 用普通用户打开不识别npm 刚换了一台新电脑,寻思安装各种环境,一顿操作猛如虎,当最后一个打开vscode后,运行项目发现,新建终端>npm run dev 无法识别。 在cmd 中 打node -…...
java泛型的协变、逆变和不变
引言 我们在看开源框架经常会看到泛型来定义数据类型。 有时候, <? extends T> 和 <? super T> 这样带通配符的泛型参数。 这种通配符的泛型是什么意思怎么用???? 概念 型变: 用来描述类…...
effective Java 学习笔记(第二弹)
effective Java 学习笔记(第一弹) 整理自《effective Java 中文第3版》 本篇笔记整理第3,4章的内容。 重写equals方法需要注意的地方 自反性:对于任何非空引用 x,x.equals(x) 必须返回 true。对称性:对于…...
Spring BeanFactoryPostProcessor 和 BeanPostProcessor有什么用?
BeanFactoryPostProcessor 和 BeanPostProcessor 都是 Spring 框架中非常重要的扩展点,我们在开发中可以利用 Spring 容器实例化 Bean、配置 Bean 以及初始化 Bean 的过程中进行自定义的干预。但它们的作用时机和作用对象不同。 1. BeanFactoryPostProcessor: 作用…...
Centos7 Gitlab17部署
确保你的安装源正常 1.安装依赖项 sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix 2.安装Gitlab (1)添加仓库 curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash (2) 安装Gitl…...
一文解读DeepSeek在工业制造领域的应用
引言 在当今数字化浪潮席卷全球的背景下,各个行业都在积极寻求创新与变革,工业制造领域也不例外。然而,传统工业制造在生产效率、质量控制、成本管理等方面面临着诸多挑战。在这一关键时期,人工智能技术的兴起为工业制造带来了新的…...
基于动态 FOF(基金中的基金)策略的基金交易推荐系统的设计与实现思路
下面为你呈现一个基于动态 FOF(基金中的基金)策略的基金交易推荐系统的设计与实现思路,同时给出一个简单的 Python 示例代码。 系统设计 1. 需求分析 收集各类基金的历史数据,涵盖净值、收益率、风险指标等。依据动态 FOF 策略…...
第一次程序Hello Python
Python环境安装 安装地址 安装地址 https://www.python.org/ 1. 安装Python 下载完成后,双击安装包(如python-3.13.2.exe),按照提示进行安装。在安装过程中,确保勾选“Add Python to PATH”选项,以便在命…...
nvm 切换node 版本 但是没有带星号*
在 Windows 系统中配置 NVM_SYMLINK 环境变量的步骤如下: 1️⃣ 设置变量路径 变量名:NVM_SYMLINK 变量值:建议设置为 C:\Program Files\nodejs(需与后续步骤中 NVM 配置的符号链接路径一致) 2️⃣ 配置系统环境变量…...
Java定时任务的三重境界:从单机心跳到分布式协调
《Java定时任务的三重境界:从单机心跳到分布式协调》 本文将以生产级代码标准,揭秘Java定时任务从基础API到分布式调度的6种实现范式,深入剖析ScheduledThreadPoolExecutor与Quartz Scheduler的线程模型差异,并给出各方案的性能压…...
1.NextJS基础
NextJS注意要点 文件用来定义路由,folder name becomes the route name注意区分客户端渲染和服务器渲染 html渲染完成后给到客户端(此时网页内容已经全部提供),有利于crawler和优化seo逻辑更简单request deduplication减少API请求…...
晶晨/全志/联发科芯片系列电视盒子改固件包教程
声明:对电视盒子进行改包(修改固件包)是一项有一定技术门槛且存在风险的操作,可能会导致盒子变砖、失去保修等问题,同时私自修改固件可能违反相关法律法规和使用协议。以下为你提供一个通用的大致改包教程,…...
2025最新3个wordpress好用的主题
红色大气的wordpress企业主题,适合服务行业的公司搭建企业官方网站使用。是一款专为中小企业和个人开发者设计的WordPress主题,旨在提供专业的网站构建解决方案。 通过此WordPress主题,用户可以轻松创建和维护一个专业的企业网站,…...
GZCTF平台搭建及题目上传
前言 我用手里的Ubuntu虚拟机搭建的,大家根据自己的实际情况来吧 安装及部署 首先,你的虚拟机需要有Docker和Docker-Compose,前者可以看我之前的文章,另外一个可以输入下面的命令安装,注意先获取管理员权限ÿ…...
openGauss关联列数据类型不一致引起谓词传递失败
今天分享一个比较有意思的案例 注意:因为原始SQL很长,为了方便排版,简化了SQL 下面SQL跑60秒才出结果,客户请求优化 select dtcs.owner, dtcs.table_name, dtcs.column_name, dct.commentsfrom dba_tab_columns dtcsleft outer j…...
【网络安全基础学习】渗透测试工具--Burp Suite详细教程
Burp Suite与SniffMaster:网络安全工具的双剑合璧 Burp Suite(简称BP)是一款用于攻击web应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。然而,除了Burp…...
手机测试,工作中学习
要学习各种机型的截图方式、开发模式在哪。 荣耀机型:截图:关节快速敲两下。开发者模式在“系统和更新”里。 1.出现缺陷,需要获取日志。 学习adb生成日志:当测试中出现缺陷的,使用adb logcat -d > d:/log.txt …...
ctfshow WEB web2
1.查当前数据库名称 or 11 union select 1,database(),3 limit 1,2;#-- 得到数据库名称web2 2.查看数据库表的数量 or 11 union select 1,(select count(*) from information_schema.tables where table_schema web2),3 limit 1,2;#-- 得到数据库表数量为2 3.查表的名字 第…...
大疆上云api介绍
概述 目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人…...
ASP.NET Web API + VUE3 整合阿里云OSS,后端API生成预签名上传Url,前端VUE进行上传
1、后端API 我用的是.net sdk6,所以先安装了这个Aliyun.OSS.SDK.NetCore 下面是后端生成上传Url的参考代码,主意request.ContentType,如果这里要是设置了,那么前端也要设置成一样的,如果前端是获取文件的contentType&…...
Java基础 3.22
1.break练习 //1-100之内的数求和,求当和第一次大于20的当前数i public class Break01 {public static void main(String[] args) {int n 0;int count 0;for (int i 1; i < 100; i) {count i;System.out.println("当前和为" count);if (count &g…...
如何快速解决 Postman 报错?
介绍一些 Postman 常见的报错与处理方法,希望能够对大家有所帮助。 Postman 一直转圈打不开的问题 Postman 报错处理指南:常见报错与解决方法...
软件性能效率测试工具有哪些?专业第三方软件检测机构推荐
在软件开发的新时代,软件性能效率测试已经成为每个企业不可或缺的一部分。无论是在竞争激烈的市场中,还是在追求卓越用户体验的过程中,都需要进行有效的性能测试。 一、软件性能效率测试的目标 1、响应时间:确保用户请求的响…...
手机销售终端MPR+LTC项目项目总体方案P183(183页PPT)(文末有下载方式)
资料解读:手机销售终端 MPRLTC 项目项目总体方案 详细资料请看本解读文章的最后内容。在当今竞争激烈的市场环境下,企业的销售模式和流程对于其发展起着至关重要的作用。华为终端正处于销售模式转型的关键时期,波士顿 - 华为销售终端 MPRLTC …...