侵权投诉

如何利用Stream API来优化Java代码

Android编程精选 ? 2021-07-26 14:30 ? 次阅读

使用Stream API优化代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读

放大招,流如何简化代码

如果有一个需求,需要对数据库查询到的菜肴进行一个处理:

筛选出卡路里小于400的菜肴

对筛选出的菜肴进行一个排序

获取排序后菜肴的名字

菜肴:Dish.java

public class Dish {

private String name;

private boolean vegetarian;

private int calories;

private Type type;

// getter and setter

}

Java8以前的实现方式

private List《String》 beforeJava7(List《Dish》 dishList) {

List《Dish》 lowCaloricDishes = new ArrayList《》();

//1.筛选出卡路里小于400的菜肴

for (Dish dish : dishList) {

if (dish.getCalories() 《 400) {

lowCaloricDishes.add(dish);

}

}

//2.对筛选出的菜肴进行排序

Collections.sort(lowCaloricDishes, new Comparator《Dish》() {

@Override

public int compare(Dish o1, Dish o2) {

return Integer.compare(o1.getCalories(), o2.getCalories());

}

});

//3.获取排序后菜肴的名字

List《String》 lowCaloricDishesName = new ArrayList《》();

for (Dish d : lowCaloricDishes) {

lowCaloricDishesName.add(d.getName());

}

return lowCaloricDishesName;

}

Java8之后的实现方式

private List《String》 afterJava8(List《Dish》 dishList) {

return dishList.stream()

.filter(d -》 d.getCalories() 《 400) //筛选出卡路里小于400的菜肴

.sorted(comparing(Dish::getCalories)) //根据卡路里进行排序

.map(Dish::getName) //提取菜肴名称

.collect(Collectors.toList()); //转换为List

}

不拖泥带水,一气呵成,原来需要写24代码实现的功能现在只需5行就可以完成了

高高兴兴写完需求这时候又有新需求了,新需求如下:

对数据库查询到的菜肴根据菜肴种类进行分类,返回一个Map《Type, List《Dish》》的结果

这要是放在jdk8之前肯定会头皮发麻

Java8以前的实现方式

private static Map《Type, List《Dish》》 beforeJdk8(List《Dish》 dishList) {

Map《Type, List《Dish》》 result = new HashMap《》();

for (Dish dish : dishList) {

//不存在则初始化

if (result.get(dish.getType())==null) {

List《Dish》 dishes = new ArrayList《》();

dishes.add(dish);

result.put(dish.getType(), dishes);

} else {

//存在则追加

result.get(dish.getType()).add(dish);

}

}

return result;

}

还好jdk8有Stream,再也不用担心复杂集合处理需求

Java8以后的实现方式

private static Map《Type, List《Dish》》 afterJdk8(List《Dish》 dishList) {

return dishList.stream().collect(groupingBy(Dish::getType));

}

又是一行代码解决了需求,忍不住大喊Stream API牛批 看到流的强大功能了吧,接下来将详细介绍流

什么是流

流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算

如何生成流

生成流的方式主要有五种

通过集合生成,应用中最常用的一种

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

Stream《Integer》 stream = integerList.stream();

通过集合的stream方法生成流

通过数组生成

int[] intArr = new int[]{1, 2, 3, 4, 5};

IntStream stream = Arrays.stream(intArr);

通过Arrays.stream方法生成流,并且该方法生成的流是数值流【即IntStream】而不是Stream《Integer》。补充一点使用数值流可以避免计算过程中拆箱装箱,提高性能。Stream API提供了mapToInt、mapToDouble、mapToLong三种方式将对象流【即Stream《T》】转换成对应的数值流,同时提供了boxed方法将数值流转换为对象流

通过值生成

Stream《Integer》 stream = Stream.of(1, 2, 3, 4, 5);

通过Stream的of方法生成流,通过Stream的empty方法可以生成一个空流

通过文件生成

Stream《String》 lines = Files.lines(Paths.get(“data.txt”), Charset.defaultCharset())

通过Files.line方法得到一个流,并且得到的每个流是给定文件中的一行

通过函数生成 提供了

iterate

generate

两个静态方法从函数中生成流

iterator

Stream《Integer》 stream = Stream.iterate(0, n -》 n + 2).limit(5);

iterate

方法接受两个参数,第一个为初始化值,第二个为进行的函数操作,因为

iterator

生成的流为无限流,通过

limit

方法对流进行了截断,只生成5个偶数

generator

Stream《Double》 stream = Stream.generate(Math::random).limit(5);

generate

方法接受一个参数,方法参数类型为

Supplier《T》

,由它为流提供值。

generate

生成的流也是无限流,因此通过

limit

对流进行了截断

流的操作类型

流的操作类型主要分为两种

中间操作 一个流可以后面跟随零个或多个中间操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的,仅仅调用到这类方法,并没有真正开始流的遍历,真正的遍历需等到终端操作时,常见的中间操作有下面即将介绍的filter、map等

终端操作 一个流有且只能有一个终端操作,当这个操作执行后,流就被关闭了,无法再被操作,因此一个流只能被遍历一次,若想在遍历需要通过源数据在生成流。终端操作的执行,才会真正开始流的遍历。如下面即将介绍的count、collect等

流使用

流的使用将分为终端操作和中间操作进行介绍

中间操作

filter筛选

List《Integer》 integerList = Arrays.asList(1, 1, 2, 3, 4, 5);

Stream《Integer》 stream = integerList.stream().filter(i -》 i 》 3);

通过使用filter方法进行条件筛选,filter的方法参数为一个条件

distinct去除重复元素

List《Integer》 integerList = Arrays.asList(1, 1, 2, 3, 4, 5);

Stream《Integer》 stream = integerList.stream().distinct();

通过distinct方法快速去除重复的元素

limit返回指定流个数

List《Integer》 integerList = Arrays.asList(1, 1, 2, 3, 4, 5);

Stream《Integer》 stream = integerList.stream().limit(3);

通过limit方法指定返回流的个数,limit的参数值必须》=0,否则将会抛出异常

skip跳过流中的元素

List《Integer》 integerList = Arrays.asList(1, 1, 2, 3, 4, 5);

Stream《Integer》 stream = integerList.stream().skip(2);

通过skip方法跳过流中的元素,上述例子跳过前两个元素,所以打印结果为2,3,4,5,skip的参数值必须》=0,否则将会抛出异常

map流映射

所谓流映射就是将接受的元素映射成另外一个元素

List《String》 stringList = Arrays.asList(“Java 8”, “Lambdas”, “In”, “Action”);

Stream《Integer》 stream = stringList.stream().map(String::length);

通过map方法可以完成映射,该例子完成中String -》 Integer的映射,之前上面的例子通过map方法完成了Dish-》String的映射

flatMap流转换

将一个流中的每个值都转换为另一个流

List《String》 wordList = Arrays.asList(“Hello”, “World”);

List《String》 strList = wordList.stream()

.map(w -》 w.split(“ ”))

.flatMap(Arrays::stream)

.distinct()

.collect(Collectors.toList());

map(w -》 w.split(“ ”))的返回值为Stream《String[]》,我们想获取Stream《String》,可以通过flatMap方法完成Stream《String[]》 -》Stream《String》的转换

元素匹配

提供了三种匹配方式

allMatch匹配所有

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

if (integerList.stream().allMatch(i -》 i 》 3)) {

System.out.println(“值都大于3”);

}

通过allMatch方法实现

anyMatch匹配其中一个

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

if (integerList.stream().anyMatch(i -》 i 》 3)) {

System.out.println(“存在大于3的值”);

}

等同于

for (Integer i : integerList) {

if (i 》 3) {

System.out.println(“存在大于3的值”);

break;

}

}

存在大于3的值则打印,java8中通过anyMatch方法实现这个功能

noneMatch全部不匹配

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

if (integerList.stream().noneMatch(i -》 i 》 3)) {

System.out.println(“值都小于3”);

}

通过

noneMatch

方法实现

终端操作

统计流中元素个数

通过count

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

Long result = integerList.stream().count();

通过使用count方法统计出流中元素个数

通过counting

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

Long result = integerList.stream().collect(counting());

最后一种统计元素个数的方法在与collect联合使用的时候特别有用

查找

提供了两种查找方式

findFirst查找第一个

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

Optional《Integer》 result = integerList.stream().filter(i -》 i 》 3).findFirst();

通过findFirst方法查找到第一个大于三的元素并打印

findAny随机查找一个

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

Optional《Integer》 result = integerList.stream().filter(i -》 i 》 3).findAny();

通过findAny方法查找到其中一个大于三的元素并打印,因为内部进行优化的原因,当找到第一个满足大于三的元素时就结束,该方法结果和findFirst方法结果一样。提供findAny方法是为了更好的利用并行流,findFirst方法在并行上限制更多【本篇文章将不介绍并行流】

reduce将流中的元素组合起来

假设我们对一个集合中的值进行求和

jdk8之前

int sum = 0;

for (int i : integerList) {

sum += i;

}

jdk8之后通过reduce进行处理

int sum = integerList.stream().reduce(0, (a, b) -》 (a + b));

一行就可以完成,还可以使用方法引用简写成:

int sum = integerList.stream().reduce(0, Integer::sum);

reduce接受两个参数,一个初始值这里是0,一个BinaryOperator《T》 accumulator 来将两个元素结合起来产生一个新值, 另外reduce方法还有一个没有初始化值的重载方法

获取流中最小最大值

通过min/max获取最小最大值

Optional《Integer》 min = menu.stream().map(Dish::compareTo);

Optional《Integer》 max = menu.stream().map(Dish::compareTo);

也可以写成:

OptionalInt min = menu.stream().mapToInt(Dish::getCalories).min();

OptionalInt max = menu.stream().mapToInt(Dish::getCalories).max();

min

获取流中最小值,

max

获取流中最大值,方法参数为

Comparator《? super T》 comparator

通过minBy/maxBy获取最小最大值

Optional《Integer》 min = menu.stream().map(Dish::compareTo));

Optional《Integer》 max = menu.stream().map(Dish::compareTo));

minBy

获取流中最小值,

maxBy

获取流中最大值,方法参数为

Comparator《? super T》 comparator

通过reduce获取最小最大值

Optional《Integer》 min = menu.stream().map(Dish::min);

Optional《Integer》 max = menu.stream().map(Dish::max);

求和

通过summingInt

int sum = menu.stream().collect(summingInt(Dish::getCalories));

如果数据类型为double、long,则通过summingDouble、summingLong方法进行求和

通过reduce

int sum = menu.stream().map(Dish::getCalories).reduce(0, Integer::sum);

通过sum

int sum = menu.stream().mapToInt(Dish::getCalories).sum();

在上面求和、求最大值、最小值的时候,对于相同操作有不同的方法可以选择执行??梢匝≡馽ollect、reduce、min/max/sum方法,推荐使用min、max、sum方法。因为它最简洁易读,同时通过mapToInt将对象流转换为数值流,避免了装箱和拆箱操作

通过averagingInt求平均值

double average = menu.stream().collect(averagingInt(Dish::getCalories));

如果数据类型为double、long,则通过averagingDouble、averagingLong方法进行求平均

通过summarizingInt同时求总和、平均值、最大值、最小值

IntSummaryStatistics intSummaryStatistics = menu.stream().collect(summarizingInt(Dish::getCalories));

double average = intSummaryStatistics.getAverage(); //获取平均值int min = intSummaryStatistics.getMin(); //获取最小值int max = intSummaryStatistics.getMax(); //获取最大值long sum = intSummaryStatistics.getSum(); //获取总和

如果数据类型为double、long,则通过summarizingDouble、summarizingLong方法

通过foreach进行元素遍历

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

integerList.stream().forEach(System.out::println);

而在jdk8之前实现遍历:

for (int i : integerList) {

System.out.println(i);

}

jdk8之后遍历元素来的更为方便,原来的for-each直接通过foreach方法就能实现了

返回集合

List《String》 strings = menu.stream().map(Dish::getName).collect(toList());

Set《String》 sets = menu.stream().map(Dish::getName).collect(toSet());

只举例了一部分,还有很多其他方法 jdk8之前

List《String》 stringList = new ArrayList《》();

Set《String》 stringSet = new HashSet《》();

for (Dish dish : menu) {

stringList.add(dish.getName());

stringSet.add(dish.getName());

}

通过遍历和返回集合的使用发现流只是把原来的外部迭代放到了内部进行,这也是流的主要特点之一。内部迭代可以减少好多代码量

通过joining拼接流中的元素

String result = menu.stream().map(Dish::getName).collect(Collectors.joining(“, ”));

默认如果不通过map方法进行映射处理拼接的toString方法返回的字符串,joining的方法参数为元素的分界符,如果不指定生成的字符串将是一串的,可读性不强

进阶通过groupingBy进行分组

Map《Type, List《Dish》》 result = dishList.stream().collect(groupingBy(Dish::getType));

在collect方法中传入groupingBy进行分组,其中groupingBy的方法参数为分类函数?;箍梢酝ü短资褂胓roupingBy进行多级分类

Map《Type, List《Dish》》 result = menu.stream().collect(groupingBy(Dish::getType,

groupingBy(dish -》 {

if (dish.getCalories() 《= 400) return CaloricLevel.DIET;

else if (dish.getCalories() 《= 700) return CaloricLevel.NORMAL;

else return CaloricLevel.FAT;

})));

进阶通过partitioningBy进行分区

分区是特殊的分组,它分类依据是true和false,所以返回的结果最多可以分为两组

Map《Boolean, List《Dish》》 result = menu.stream().collect(partitioningBy(Dish :: isVegetarian))

等同于

Map《Boolean, List《Dish》》 result = menu.stream().collect(groupingBy(Dish :: isVegetarian))

这个例子可能并不能看出分区和分类的区别,甚至觉得分区根本没有必要,换个明显一点的例子:

List《Integer》 integerList = Arrays.asList(1, 2, 3, 4, 5);

Map《Boolean, List《Integer》》 result = integerList.stream().collect(partitioningBy(i -》 i 《 3));

返回值的键仍然是布尔类型,但是它的分类是根据范围进行分类的,分区比较适合处理根据范围进行分类

总结

通过使用Stream API可以简化代码,同时提高了代码可读性,赶紧在项目里用起来。讲道理在没学Stream API之前,谁要是给我在应用里写很多Lambda,Stream API,飞起就想给他一脚。我想,我现在可能爱上他了【嘻嘻】。同时使用的时候注意不要将声明式和命令式编程混合使用。

来源丨juejin.cn/post/6844903945005957127

编辑:jq

原文标题:巧用 Stream API 优化 Java 代码

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

关于java性能优化的一些细节

代码优化 ,一个很重要的课题??赡苡行┤司醯妹挥?,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢? ...
发表于 10-11 09:23 ? 0次 阅读

C/C++中调用Java不同类中的静态方法有哪些

C/C++中调用Java不同类中的静态方法有哪些? C/C++调用java的方法是什么? ...
发表于 09-30 08:12 ? 0次 阅读

如何用一行代码解决空指针问题

在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerExce....
的头像 Android编程精选 发表于 09-29 14:28 ? 208次 阅读

JavaUI框架新增组件开发指南

Java UI框架是HarmonyOS应用开发中诸多开发者需要关注的重要内容。近期,文档君结合各位开....
的头像 HarmonyOS开发者 发表于 09-28 10:04 ? 351次 阅读
JavaUI框架新增组件开发指南

JAVA连接Oracle数据库实代码+详细注释

JAVA连接Oracle数据库实代码+详细注释(西工大现代电源技术考题)-该文档为JAVA连接Ora....
发表于 09-27 13:48 ? 17次 阅读
JAVA连接Oracle数据库实代码+详细注释

如何去制作一个简易的计算器

如何去制作一个简易的计算器? 简易的计算器有何功能? ...
发表于 09-27 08:44 ? 0次 阅读

拓扑排序算法有什么作用

大家好,我是bigsai。 拓扑排序,很多人都可能听说但是不了解的一种算法。不知者大多会提出这样的疑....
的头像 算法与数据结构 发表于 09-24 10:53 ? 208次 阅读
拓扑排序算法有什么作用

仅供大家学习交流的Java题目

仅供大家学习交流的Java题目(深圳市核达中远通电源技术股份有限公司电话)-仅供大家学习交流的Jav....
发表于 09-23 10:48 ? 14次 阅读
仅供大家学习交流的Java题目

程序员如何自己new一个对象

https://www.ciphermagic.cn/java8-builder.html 程序员经....
的头像 Android编程精选 发表于 09-22 09:37 ? 870次 阅读

怎么实现基于java的土地档案管理系统设计?

怎么实现基于java的土地档案管理系统设计?
发表于 09-18 06:41 ? 0次 阅读

(网盘)java之package以及eclipse的使用等试验视频资料

(网盘)java之package以及eclipse的使用等试验视频资料(电源技术期刊是不是ei)-关....
发表于 09-16 15:21 ? 21次 阅读
(网盘)java之package以及eclipse的使用等试验视频资料

深度解读HarmonyOS自定义UI组件的使用

???? 一、UI组件概述 ? UI组件(以下简称“组件”),是构建界面的核心。 应用中所有的界面元....
的头像 HarmonyOS开发者 发表于 09-16 09:30 ? 207次 阅读
深度解读HarmonyOS自定义UI组件的使用

使用Kotlin替代Java重构AOSP应用

两年前,Android 开源项目 (AOSP) 应用团队开始使用 Kotlin 替代 Java 重构....
的头像 谷歌开发者 发表于 09-16 09:26 ? 234次 阅读
使用Kotlin替代Java重构AOSP应用

Java程序员的4个职业发展方向,如何把握黄金5年?

在Java程序界流行着一种默认的说法叫“黄金5年”,意思是说,一个Java程序员从入职的时候算起,前五年的选择直接影响着整个职业...
发表于 09-12 15:57 ? 202次 阅读

Java破解工具软件下载

Java破解工具软件下载
发表于 09-12 10:21 ? 55次 阅读

基于Java的接口快速开发框架

作者丨编码砖家 来源丨http://adkx.net/w5m4s Part1简介 magic-api....
的头像 Android编程精选 发表于 09-10 09:36 ? 1144次 阅读

2021图灵设计<全端Web开发:使用JavaScript与Java>王群锋书签完整PDF网盘下载分享

全端Web开发:使用JavaScript与Java书签完整PDF下载 链接: 提取码:r9fy ...
发表于 09-10 08:01 ? 707次 阅读

在AArch64平台上性能下降的例子

编者按:目前许多公司同时使用 x86 和 AArch64 2 种主流的服务器。这两种环境的算力相当,....
的头像 Linux阅码场 发表于 09-09 11:11 ? 302次 阅读

异步程序到底是什么

最近在学C#,有一个业务需要用到多线程技术;记得上大二的时候,选修Java的时候就接触过多线程,只是觉得很深奥,很“高级”。...
发表于 09-06 07:52 ? 0次 阅读

基于HarmonyOS Java UI,使用元数据绑定框架,实现UI和数据源的绑定

1. 介绍       元数据绑定框架是基于HarmonyOS SDK开发的一套提供UI和数据源绑定能力的框架。通过...
发表于 09-01 14:54 ? 101次 阅读

请问java如何通过与4g??镈TU通信控制串口设备PLC?

java通过与4g??镈TU通信控制串口设备PLC解决方案...
发表于 08-30 06:36 ? 0次 阅读

并行程序设计中最重要的锁-RCU锁

hi,大家好,今天给大家分享并行程序设计中最重要的锁-RCU锁,RCU锁本质是用空间换时间,是对读写....
的头像 开关电源芯片 发表于 08-27 14:25 ? 382次 阅读

怎么样才能让Java代码编写更规范化

作者 | 涛姐涛哥 链接 | cnblogs.com/taojietaoge/p/11575376.....
的头像 Android编程精选 发表于 08-27 09:31 ? 1508次 阅读

java可以安装到d盘吗

1000公斤车载小吊机底座电机板可以安装电动提升机吗?500公斤车载小吊机底座电机板孔位有8个孔位,中间部分安装电动绞盘、两侧对...
发表于 08-27 07:16 ? 0次 阅读

大文件上传服务器、支持超大文件HTTP断点如何续传教程

最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传....
的头像 Android编程精选 发表于 08-26 15:36 ? 929次 阅读

如何提高代码性能、使代码远离Bug、令代码更优雅

背景:如何更规范化编写Java代码的重要性想必毋需多言,其中最重要的几点当属提高代码性能、使代码远离....
的头像 奈因PCB电路板设计 发表于 08-17 09:42 ? 274次 阅读

Mockito是什么 什么情况下使用Mockito

相信每一个程序猿在写Unit Test的时候都会碰到一些令人头疼的问题:如何测试一个rest接口;如....
的头像 华为无线网络 发表于 08-09 14:39 ? 395次 阅读

Java智能卡EEPROM碎片整理算法

Java智能卡EEPROM碎片整理算法(c语言嵌入式开发需要学的东西)-Java智能卡EEPROM碎....
发表于 07-30 11:34 ? 59次 阅读
Java智能卡EEPROM碎片整理算法

Java架构面试笔试专题资料及经验(含答案)和学习笔记: ActiveMQ消息中间件面试专题.pdf

Java架构面试笔试专题资料及经验(含答案)和学习笔记: ActiveMQ消息中间件面试专题.pdf....
发表于 07-26 11:28 ? 63次 阅读
Java架构面试笔试专题资料及经验(含答案)和学习笔记: ActiveMQ消息中间件面试专题.pdf

鸿蒙系统真的比安卓流畅吗

? ? ? 鸿蒙系统的推出,大家说得最多的体验就是纵享丝滑,那华为真的比安卓丝滑吗? ? ? ?安卓....
的头像 汽车玩家 发表于 07-06 18:23 ? 3334次 阅读

如果编程语言是一门武功绝学,那各语言分别是哪些武功绝学

汇编语言是计算机提供给用户的最快最有效的语言,也是能够利用计算机的所有硬件特性并能够直接控制硬件的唯....
的头像 strongerHuang 发表于 07-05 15:06 ? 449次 阅读

STM32CubeMX图形化配置工具的安装教程

  STM32CubeMX是STM32芯片图形化配置工具,通过简单的操作便能实现相关配置,省去了我们....
的头像 STM32嵌入式开发 发表于 07-02 16:00 ? 692次 阅读
STM32CubeMX图形化配置工具的安装教程

如何通过卡片进行直达教育类专栏分类照片

# 前言 对于教育类应用程序来说,一般都有课程分类,包括我们程序员学习技术,也简单。简单的说,一个程....
的头像 HarmonyOS官方合作社区 发表于 06-30 09:43 ? 385次 阅读

鸿蒙系统官网2.0报名入口 华为p20系统支持鸿蒙操作系统

Hi,各位小伙伴们,相信大家已经知道华为发布了鸿蒙操作系统2.0版本,后台有太多小伙伴私信问小编,同....
的头像 Les 发表于 06-25 10:17 ? 2847次 阅读
鸿蒙系统官网2.0报名入口  华为p20系统支持鸿蒙操作系统

采用JSON数据交换格式实现数据交换框架的设计

随着无线技术的发展和无线通信设备的普及,基于手机、PDA等小型消费类和嵌人式设备的无线移动应用越来越....
的头像 电子设计 发表于 06-24 17:09 ? 694次 阅读
采用JSON数据交换格式实现数据交换框架的设计

openharmony java

面向MCU类处理器例如Arm Cortex-M、RISC-V 32位的设备,硬件资源极其有限,支持的....
的头像 倩倩 发表于 06-24 10:31 ? 471次 阅读

openharmony源码地址 openharmony编译运行

一、Openharmony源码地址以及获取方式 开源代码仓库地址:https://openharmo....
的头像 Les 发表于 06-23 10:49 ? 475次 阅读

openharmony原生应用有哪些?

开放原子开源基金会(OpenAtom Foundation,以下简称“基金会”)正式发布 OpenA....
的头像 Les 发表于 06-23 09:35 ? 355次 阅读

为什么Java线程没有Running状态?

什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O....
的头像 Android编程精选 发表于 06-17 17:36 ? 396次 阅读

建议收藏的20款实用的数据可视化工具

如今学习应用数据可视化的渠道有很多,你可以跟踪一些专家博客,但更重要的一点是实践/实操,你必须对目前....
的头像 人工智能与大数据技术 发表于 06-17 09:47 ? 453次 阅读

Lombok开发插件使用小技巧

0x01:Lombok简介 Lombok 是一款 Java开发插件,使得 Java 开发者可以通过其....
的头像 电子发烧友网工程师 发表于 06-12 18:07 ? 368次 阅读

简述那些JDK中坑你没商量的方法

前言 JDK 作为我们每天必备的调用类库,里面大量提供了基础类供我们使用??梢运道肟?JDK ,我们....
的头像 电子发烧友网工程师 发表于 06-12 17:36 ? 306次 阅读
简述那些JDK中坑你没商量的方法

一篇文章带你吃透Linux虚拟内存

前不久组内又有一次我比较期待的分享:”Linux 的虚拟内存”。是某天晚上加班时,我们讨论虚拟内存的....
的头像 Linux爱好者 发表于 06-07 17:00 ? 566次 阅读
一篇文章带你吃透Linux虚拟内存

Java程序员最容易犯的10个SQL错误是哪些

Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编....
的头像 电子发烧友网工程师 发表于 06-07 15:59 ? 529次 阅读

C语言已经连续一年多TIOBE编程语言排名第一

很多初学者看不起 C 语言,甚至觉得 C 语言没什么可学。站在过来人的角度,C语言仍然值得学习,它仍....
的头像 strongerHuang 发表于 06-07 14:53 ? 661次 阅读

JavaScrit数据结构与算法(第2版)

JavaScrit数据结构与算法(第2版)教材下载。
发表于 06-01 15:35 ? 71次 阅读

JAVA并发编程实践

JAVA并发编程实践资料免费下载。
发表于 06-01 15:31 ? 75次 阅读

Java并发编程的艺术

Java并发编程的艺术说明。
发表于 06-01 15:31 ? 84次 阅读

数据结构与算法分析——Java语言描述

数据结构与算法分析——Java语言描述说明。
发表于 05-31 14:25 ? 78次 阅读

基于JXTA开发技术和Java语言实现对等式网络模型即时通信系统的设计

P2P技术将在网络尤其是宽带网络方面具备强大的应用潜力,2002 legend world大会上中科....
的头像 电子设计 发表于 05-22 16:15 ? 599次 阅读
基于JXTA开发技术和Java语言实现对等式网络模型即时通信系统的设计

鸿蒙语音播报懒人“看”书新法到底如何实现?

现代社会节奏较快,人们看书可能不仅仅只用眼睛,有时候也会用耳朵来“听书”,语音播报由此诞生,并通过人....
的头像 电子发烧友网工程师 发表于 05-20 16:41 ? 1514次 阅读
鸿蒙语音播报懒人“看”书新法到底如何实现?

从语言进步到编程

  在培训的授课阶段即将结束之际,趁脑子还比较清楚,总结一下课堂上向大家灌输的编程思想。现在看不太懂....
发表于 05-18 09:25 ? 60次 阅读

Java编程思想(第五版)

Java编程思想(第五版)免费下载。
发表于 05-12 14:57 ? 159次 阅读

世界上最赚钱的编程语言是什么?

许多人因为薪资高而选择编程行业,但你知道什么是世界上最赚钱的编程语言吗?话不多说,让我们用数据来证明....
的头像 5G网通信 发表于 05-11 11:38 ? 872次 阅读
世界上最赚钱的编程语言是什么?

面向Java的Randoop自动化单元测试生成工具

自动化单元测试是现代软件开发研究的热点。 Randoop自动化单元测试用例生成工具针对Java和.N....
发表于 05-07 10:19 ? 114次 阅读
面向Java的Randoop自动化单元测试生成工具

Java语言有哪些特性

Java语言的作者们编写了具有广泛影响的Java白皮书,里面详细地介绍了他们的设计目标以及实现成果,....
的头像 电子魔法师 发表于 05-01 16:08 ? 410次 阅读

李宁为什么选择加入HarmonyOS生态?

其实很久以前我就一直在寻找关于 HarmonyOS 的资料,只是华为的保密性做的非常好,并没有找到有....
的头像 电子发烧友网工程师 发表于 04-23 10:46 ? 627次 阅读

Go语言凭借什么成为云原生第一语言的?

偶然看到有人说, Go 语言目前的火爆可能就是昙花一现而已。这个观点我当然是不认同的。 近几年,关于....
的头像 strongerHuang 发表于 04-22 10:15 ? 1011次 阅读
Go语言凭借什么成为云原生第一语言的?

还在使用kill -9 pid结束spring boot项目吗?

kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该....
的头像 Linux爱好者 发表于 04-13 16:01 ? 407次 阅读
还在使用kill -9 pid结束spring boot项目吗?

“Java侵权案”的判决结果出炉:Google胜诉

当地时间 4 月 5 日,美国最高法院发布有关“Java侵权案”的判决结果,Google 以 6-2....
的头像 DeepTech深科技 发表于 04-09 10:11 ? 683次 阅读
最好看的最新高清中文字幕,我不卡影院午夜伦不卡,亚洲国产在线精品一区在,yw193.尤物影院 宾阳县| 体育| 万载县| 吉首市| 阿荣旗| 余姚市| 枣庄市| 麻阳| 万盛区| 临沂市| 凤阳县| 阿巴嘎旗| 耿马| 涟水县| 双鸭山市| 琼中| 台中市| 伊金霍洛旗| 瓮安县| 资溪县| 微博| 永川市| 虎林市| 青神县| 河曲县| 中西区| 绵竹市| 玉环县| 江孜县| 杭锦旗| 平顶山市| 朝阳县| 克东县| 伊吾县| 兴安县| 都江堰市| 崇信县| 金塔县| 湖南省| 醴陵市| 大理市| http://444 http://444 http://444 http://444 http://444 http://444