放大招,如何使用Stream API优化代码?

【Java】stream流 stream流可以通过简单的方式去处理一个数据集合,而不用通过冗杂的循环遍历Stream中的元素是以Optional类型存在的optional 允许元素为空。 阅读详情

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

01 放大招,流如何简化代码

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

  • 筛选出卡路里小于400的菜肴
  • 对筛选出的菜肴进行一个排序
  • 获取排序后菜肴的名字

菜肴:Dish.java

public class Dish {
 private String name;
 private boolean vegetarian;
 private int calories;
 private Type type;
 // getter and setter
}

1.1 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;
 }

1.2 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之前肯定会头皮发麻

1.3 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,再也不用担心复杂集合处理需求

1.4 Java8以后的实现方式

private static Map<Type, List<Dish>> afterJdk8(List<Dish> dishList) {
 return dishList.stream().collect(groupingBy(Dish::getType));
}

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

                                                                

 

02 什么是流

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

03 如何生成流

生成流的方式主要有五种

  • 通过集合生成,应用中最常用的一种
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对流进行了截断

04 流的操作类型

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

  • 中间操作 一个流可以后面跟随零个或多个中间操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的,仅仅调用到这类方法,并没有真正开始流的遍历,真正的遍历需等到终端操作时,常见的中间操作有下面即将介绍的filter、map等
  • 终端操作 一个流有且只能有一个终端操作,当这个操作执行后,流就被关闭了,无法再被操作,因此一个流只能被遍历一次,若想在遍历需要通过源数据在生成流。终端操作的执行,才会真正开始流的遍历。如下面即将介绍的count、collect等

05 流使用

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

5.1 中间操作

(1)filter筛选

 List<Integer> integerList = Arrays.asList(1, 1, 2, 3, 4, 5);
 Stream<Integer> stream = integerList.stream().filter(i -> i > 3);

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

(2)distinct去除重复元素

List<Integer> integerList = Arrays.asList(1, 1, 2, 3, 4, 5);
Stream<Integer> stream = integerList.stream().distinct();

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

(3)limit返回指定流个数

 List<Integer> integerList = Arrays.asList(1, 1, 2, 3, 4, 5);
 Stream<Integer> stream = integerList.stream().limit(3);

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

(4)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,否则将会抛出异常

(5)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的映射

(6)flatMap流转换

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

List<String> stringList = Arrays.asList("Hello", "World");
List<Stream<String>> str = stringList.stream()
 .map(world -> world.split(" "))
 .flatMap(Arrays::stream)
 .distinct()
 .collect(Collectors.toList());

map(world -> world.split(" "))的返回值为Stream<String[]>,我们想获得的结果为Stream<String>,可以通过flatMap方法完成Stream<String[]> ->Stream<String>的转换

(7)元素匹配

提供了三种匹配方式

  • 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方法实现

5.2 终端操作

(1)统计流中元素个数

  • 通过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联合使用的时候特别有用

(2)查找

提供了两种查找方式

  • 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方法在并行上限制更多【本篇文章将不介绍并行流】

(3)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方法还有一个没有初始化值的重载方法

(4)获取流中最小最大值

  • 通过min/max获取最小最大值
Optional<Integer> min = menu.stream().map(Dish::getCalories).min(Integer::compareTo);
Optional<Integer> max = menu.stream().map(Dish::getCalories).max(Integer::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::getCalories).collect(minBy(Integer::compareTo));
Optional<Integer> max = menu.stream().map(Dish::getCalories).collect(maxBy(Integer::compareTo));

  • minBy获取流中最小值,maxBy获取流中最大值,方法参数为Comparator<? super T> comparator
  • 通过reduce获取最小最大值
Optional<Integer> min = menu.stream().map(Dish::getCalories).reduce(Integer::min);
Optional<Integer> max = menu.stream().map(Dish::getCalories).reduce(Integer::max);

(5)求和

  • 通过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();

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

(6)通过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方法

(7)通过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方法就能实现了

(8)返回集合

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());
}

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

(9)通过joining拼接流中的元素

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

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

(10)进阶通过groupingBy进行分组

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

在collect方法中传入groupingBy进行分组,其中groupingBy的方法参数为分类函数。还可以通过嵌套使用groupingBy进行多级分类

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;
 })));

(11)进阶通过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));

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

06 总结

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

                                 

 

imango老哥说的很对,别用声明式编程的语法干命令式编程的勾

                        

 

Stream流中anyMatch和allMatch和noneMatch的区别 allMatch里面不适合写 && ,只适合写 ||,如果写&&,编译器会自动报黄色波浪线。 阅读详情

相关推荐

java8利用Stream方法求两个List对象的交集、差集与并集(即:anyMatch和allMatch和noneMatch的区别详解)

这里anyMatch表示,判断的条件里,任意一个元素符合条件,就返回true值。在allMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 Predicate 是接收一个T类型参数,然后经过逻辑验证返回布尔值结果。判断数据列表中全部元素都不符合设置的predicate条件,如果是就返回true,否则返回false,流为空时总是返回true。判断数据列表中全部元素都符合设置的predicate条件,如果是就返回true,否则返回false,流为空时总是返回true。

炉火纯青 7320

Stream流详解

stream流操作是Java 8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中,能 让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力。同时stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。............

ss810540895的博客 3万+

Ubuntu20.04下运行LOAM系列:A-LOAM、LeGO-LOAM、SC-LeGO-LOAM、LIO-SAM 和 LVI-SAM

在我第一篇博文Ubuntu 20.04配置ORB-SLAM2和ORB-SLAM3运行环境+ROS实时运行ORB-SLAM2+Gazebo仿真运行ORB-SLAM2+各种相关库的安装的基础环境下跑通A-LOAM首先已经按照上一篇文章已经安装好了ROS noetic、Eigen3.4.0、OpenCV4.2.0和PCL1.10,A-LOAM在Github的开源地址:https://github.com/HKUST-Aerial-Robotics/A-LOAM。接下来根据代码要求,需要安装Ceres,另外环境的变

zardforever123的博客 3万+

Java——Stream流

Java——Stream流 stream是数据渠道,用于操作数据源(集合、数组)所生产的元素序列。这一类操作称作局和操作,它的基本流程是: ​ 1、将原始数据或数组对象转换为stream流。 ​ 2、对stream流中的元素进行一系列的过滤、查找等中间操作(Intermediate Operations),然后 仍返回一个Stream流对象 ​ 3、对stream流进行统计、遍历、收集等终结操作(Terminal Operation)获取想要的结果。 Stream流有以下的特点: stream是不能存储

candycrush_CL的博客 3244

Bladed风电仿真软件新手必看:从界面操作到功率曲线计算的完整指南

本文为风电工程师提供Bladed仿真软件的完整入门指南,涵盖界面操作、功率曲线计算及动态仿真等核心功能。通过实战技巧和常见问题解决方案,帮助新手快速掌握这款全球领先的风电机组仿真工具,提升风电项目开发效率。

weixin_30839881的博客 102

2025 年国人友好神刊盘点:20 本审稿快、分区高的 SCI 期刊,速抢发文先机!

科睿唯安最新发布的 2024 年影响因子(2025 年公布)显示,多本 TOP 期刊影响因子迎来大幅上涨!尤其是对国人友好的期刊,因审稿效率高、版面费亲民、国人发文占比超 40%,成为科研人员投稿热门。本文精选 20 本潜力神刊,涵盖Cell 子刊、顶流期刊、黑马期刊、性价比之王及新晋分区 TOP,附完整的影响因子、中科院分区、审稿周期、收稿方向攻略,助你抢占发文先机!

good_rrrrr的博客 5560

使用 Stream API 优化 Java 代码

放大招,流如何简化代码 什么是流 如何生成流 流的操作类型 流使用 中间操作 终端操作 总结 大家好,我是基基! “ Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行..

lucky的专栏 140

Modbus协议介绍及解析

Modbus协议介绍及解析 1.Modbus简介 Modbus是一种广泛应用于工业控制领域串行通信协议,以其开放性、高可靠性、高效简单性、免费等优点,成为了工业领域通信协议的业界标准,是工业现场电子设备之间常用的连接方式。Modbus按其格式可分为Modbus-RTU,Modbus-ASCII,Modbus-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而Modbus-TCP主要应用于基于以太网TCP/IP通信的控制网络中。通过此协议,控制器相互之间、或控制器和其它设备之间进行通

逍遥子的博客 1万+

使用 Stream API 优化你的代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 菜肴:Dish.java publicclassD...

Java笔记虾 1686

Flatten 层的深度理解与运用

Flatten 层的深度理解与运用

你要拥有一个你喜欢并且热爱的人生 7035

深度学习在传感器数据分析中的创新应用

传感器是物理世界与数字世界的“接口”,其生成的高维、时序、多源数据蕴含着设备状态、环境变化、用户行为等关键信息。传统传感器数据分析依赖手工特征工程与简单机器学习模型,难以应对复杂场景下的非线性、长程依赖与实时性需求。深度学习通过自动特征提取非线性建模与端到端学习,成为传感器数据处理的革命性工具。本文从概念基础理论框架架构设计实现机制到实际应用,系统拆解深度学习与传感器数据的融合逻辑,结合工业预测维护医疗健康监测智能交通等场景,揭示其技术边界与未来演化方向。

大数据洞察的博客 568

使用Stream API优化 Java 代码

Java8的Stream API通过流式操作和Lambda表达式显著简化了集合处理代码。文章对比了传统方式与Stream API实现数据筛选、排序和分组的功能,展示了后者只需几行代码即可完成复杂操作。Stream API提供了filter、distinct、limit、skip、map等中间操作,以及collect、count等终端操作,支持链式调用和延迟计算。生成流的方式包括集合、数组、值、文件和函数。Stream API使代码更简洁易读,大幅提升开发效率。

月色真美 风也温柔 748

Tmux学习总结

Tmux 重要概念 使用 Tmux 的时候千万不要去背指令,所有的指令都可以在 .tmux.conf 配置文件中绑定自己顺手的快捷键,也可以配置开启鼠标。 这个是我的配置文件:https://github.com/zuorn/tmux.conf 在Tmux逻辑中,需要分清楚Server > Session > Window > Pane这个大小和层级顺序是极其重要的,直接关系到工作效率: Server:是整个tmux的后台服务。有时候更改配置不生效,就要使用tmux kill-

满目星辰 579

学会使用 Stream API 优化你的代码

作者:何甜甜在吗juejin.im/post/5d8226d4e51d453c135c5b9aJava8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,...

Java笔记虾 768

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1196

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

优化 Java 代码,请使用 Stream API 。

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 需要更多教程,微信扫码即可 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 publicclassDish{ privateStringname; ...

qfguan的博客 289

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Stream API优化代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的用户进行一个处理: 筛选出年龄小于18的用户 对筛选出的用户进行一个排序 获取排序后用户的名字 public class User { private Str...

天宇的博客 234

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

使用 Stream API 高逼格 优化 Java 代码!

作者 |何甜甜在吗来源 |https://juejin.cn/post/6844903945005957127使用Stream API优化代码Java8的新特性主要是Lambda表达式...

程序猿DD 569

使用Stream API优化代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 原文:https://juejin.cn/post/6844903945005957127 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 菜肴:Dish.java public class Dish { private ..

haifei0926的专栏 266

巧用 Stream API 优化 Java 代码

往期热门文章:1、最牛逼的故障诊断工具!秒级定位线上问题2、新技能 MyBatis 千万数据表,快速分页!3、常见的SQL面试题:经典50例4、事务注解 @Transactional 失效...

Java之间 112

使用 Stream API 高逼格 优化 Java 代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 Dish.java public class Dish { private String name ; private boolean vegetarian ; private int calories

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 405

stream流倒序排序_放大招,快使用Java8新特性:Stream+Lambda优化你的代码吧!

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读放大招,流如何简化代码如果有一个需求,需要对数据库查询到的菜肴进行一个处理:筛选出卡路里小于400的菜肴对筛选出的菜肴进行一个排序获取排序后菜肴的名字菜肴:Dish.javapublicclassDish{privateSt...

weixin_34007888的博客 688
上一篇: 程序员敲一年代码,能存多少钱?程序员晒出存款,网友:打扰了!
下一篇: 拒绝6家公司offer,最后降薪入职小公司感叹:不要追求高薪去跳槽!
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值