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>() {@Overridepublic 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牛批看到流的强大功能了吧,接下来将详细介绍流

# 什么是流

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

# 如何生成流

生成流的方式主要有五种

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

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

通过集合的stream方法生成流

2.通过数组生成

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方法将数值流转换为对象流

3.通过值生成

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);

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

4.通过文件生成

Stream<String> lines = Files.lines(Paths.get("data.txt"), Charset.defaultCharset())

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

5.通过函数生成提供了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对流进行了截断

# 流的操作类型

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

1.中间操作

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

2.终端操作

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

元素匹配

提供了三种匹配方式

1.allMatch匹配所有

List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
if (integerList.stream().allMatch(i -> i > 3)) {System.out.println("值都大于3");
}

通过allMatch方法实现

2.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方法实现这个功能

3.noneMatch全部不匹配

List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
if (integerList.stream().noneMatch(i -> i > 3)) {System.out.println("值都小于3");
}

通过noneMatch方法实现

终端操作

统计流中元素个数

1.通过count

List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
Long result = integerList.stream().count();

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

2.通过counting

List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
Long result = integerList.stream().collect(counting());

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

查找

提供了两种查找方式

1.findFirst查找第一个

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

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

2.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::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);

求和

通过summingIntint

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

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

通过reduceint 

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将对象流转换为数值流,避免了装箱和拆箱操作

通过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的方法参数为分类函数。还可以通过嵌套使用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;})));

进阶通过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,飞起就想给他一脚。

完整可运行代码

package com.wenxiaowu.senior;import org.junit.Assert;
import org.junit.Test;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;import static java.util.Comparator.comparing;/*** stream流和lambda结合*/
public class StreamTest {@Testpublic void test1() {List<Dish> dishList = new ArrayList<>();dishList.add(new Dish("dish1", true, 100, Type.A));dishList.add(new Dish("dish2", false, 200, Type.B));List<String> list1 = beforeJava8(dishList);List<String> list2 = afterJava8(dishList);Assert.assertEquals(true, list1.size() == list2.size());}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}private List<String> beforeJava8(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>() {@Overridepublic 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;}
}class Dish {private String name;private boolean vegetarian;private int calories;private Type type;public Dish(String name, boolean vegetarian, int calories, Type type) {this.name = name;this.vegetarian = vegetarian;this.calories = calories;this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isVegetarian() {return vegetarian;}public void setVegetarian(boolean vegetarian) {this.vegetarian = vegetarian;}public int getCalories() {return calories;}public void setCalories(int calories) {this.calories = calories;}public Type getType() {return type;}public void setType(Type type) {this.type = type;}
}enum Type {A,B
}

转载:妙用Stream优化老代码,立马清爽了! (qq.com)

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 经历121,市场情绪极度恐慌,美联储加息对我们有什么影响,币圈人又该何去何从?

    昨天年会&#xff0c;准备了一天&#xff0c;感觉还是有些发挥不好&#xff0c;总有些美中不足&#xff0c;我还喝醉了&#xff0c;有点惨不忍睹。 有时候就是这样&#xff0c;就算做好万全的准备&#xff0c;生活总是会出乎意料的&#xff0c;币圈亦是如此。 经历了121的大跌&…...

    2024/4/20 17:21:00
  2. 从零开始学习C++ Day 006

    本科郑州大学应用化学系&#xff0c;研究生福州大学物理化学&#xff0c;后从事营地教育两年&#xff0c;现在跨专业考研至计算机。 写这个文章记录的初衷是希望通过这样的方式来监督自己每日学习一定量的编程保持练习&#xff0c;虽然初试的成绩还未出。但只要有一线希望自然…...

    2024/4/24 22:09:25
  3. Go语言的创建HTTP客户端(未完成)

    超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09; 理解HTTP 要理解HTTP请求的结构&#xff0c;一种不错的方式是使用curl。输入命令行如下&#xff1a; curl -s -o /dev/null -v http://google.com 运行结果如下&#xff1a; * Tryi…...

    2024/4/16 8:53:27
  4. Kylin Cube 构建优化

    文章目录使用衍生维度&#xff08;derived dimension&#xff09;使用聚合组&#xff08;Aggregation group&#xff09;Row Key 优化使用衍生维度&#xff08;derived dimension&#xff09; 衍生维度用于在有效维度内将维度表上的非主键维度排除掉&#xff0c;并使用维度表的…...

    2024/4/21 6:42:35
  5. 小乐乐与进制转换

    描述小乐乐在课上学习了二进制八进制与十六进制后&#xff0c;对进制转换产生了浓厚的兴趣。因为他的幸运数字是6&#xff0c;所以他想知道一个数表示为六进制后的结果。请你帮助他解决这个问题。 输入描述&#xff1a;输入一个正整数n (1 ≤ n ≤ 10^9) 输出描述&#xff1a;…...

    2024/4/18 7:36:04
  6. 数据结构及算法之异或

    一、概念 概念来自百度百科。 链接如下&#xff1a; 异或 异或也叫半加运算&#xff0c;其运算法则相当于不带进位的二进制加法&#xff1a;二进制下用1表示真&#xff0c;0表示假&#xff0c;则异或的运算法则为&#xff1a;0⊕00&#xff0c;1⊕01&#xff0c;0⊕11&#xff…...

    2024/4/14 2:51:45
  7. 两个子序列(C语言)

    题目 学习了字符串相关知识的王大队长在思考一些问题&#xff1a;现在王大队长有一个字符串 ss &#xff0c;他想找到两个非空字符串 aa and bb &#xff0c;来满足下面的条件&#xff1a; 字符串 aa 和 bb 都是 ss 的子序列&#xff1b; 对于每个索引 ii, 字符串 ss 的字符 …...

    2024/4/20 1:34:09
  8. 对HashMap的一些汇总

    文章目录前言一、HashMap的数据结构和工作原理1.数据结构2.工作原理3.扩容二、底层实现2.代码举例前言 最近复习到JAVA的HashMap这一块&#xff0c;也算是比较重要的内容&#xff1b;写个博客记录一下学习过程中的一些理解。 参考文档&#xff1a; https://blog.csdn.net/weix…...

    2024/4/24 11:41:32
  9. JavaScript高级教程(函数进阶、闭包、正则表达式、ES6新增语法、新增扩展方法)

    目录 函数的定义与调用 严格模式 什么是严格模式 开启严格模式 严格模式中的变化 高阶函数 闭包 正则表达式 ES6新增语法 ES6的内置对象扩展 Array的扩展方法 String的扩展方法 Set数据结构 函数的定义与调用 函数有三种定义方式&#xff1a; 自定义函数&#x…...

    2024/4/14 2:51:25
  10. J1900搭建centos家用服务器

    J1900搭建centos家用nas服务器 这几天在家里用一些渣渣配件装了个小服务器放家里使用啊。效果还是很不错的&#xff0c;在这里贴出我安装用的一些命令。希望可以给有需要的人提供一些思路。 系统使用的是centos7啊&#xff0c;这个装宝塔面板可以安装python项目管理器。然后软…...

    2024/4/14 2:52:41
  11. zabbix[服务端安装]

    zabbix 文章目录zabbix一、配置环境二、安装zabbix提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、配置环境 配置3台虚拟机虚拟机&#xff0c;其中一台做server端 二、安装zabbix yum install -y yum-utils rpm -Uvh https://repo.zabbix.com/z…...

    2024/4/14 2:52:31
  12. 外网用户通过域名访问公司内网某些网页服务

    1.配置防火墙端口映射&#xff0c;将内网服务映射到公司出口 配置了nat server后防火墙的安全策略要放行。我这个默认允许所有流量通行&#xff0c;不做配置。 2.配置外网主机hosts文件&#xff0c;路径为C:\Windows\System32\drivers\etc\hosts。 添加两条域名映射&#xff0…...

    2024/4/14 2:52:11
  13. Java采用案例对开关式Switch的运用进行分析 |CSDN创作

    //根据获奖名次给予奖励 String reward;//给予的奖励 int rank;//获奖名次 Scanner scnew Scanner(System.in); System.out.print("输入获奖的名次:"); ranksc.nextInt(); //处理部分//switch可与if else一起用 也可单用 switch (rank){//打开代码的开关case 1:rewar…...

    2024/4/14 2:52:16
  14. 计算机网络-自顶向下笔记-应用层-Email应用

    计算机网络所有笔记链接 因特网中的电子邮件 和普通的邮件一样&#xff0c;电子邮件是一种 异步通信媒介&#xff0c;就是当我们方便的时候就可以进行邮件的收发&#xff0c;不用和他人商量好了什么时间进行收发工作。特性&#xff1a;包括具有附件、超链接、HTML格式文本和图…...

    2024/4/19 9:59:13
  15. 使用AJAX技术,结合监听器,实现页面中动态显示当前网站在线人数(电子工业出版社《Java Web程序设计》P171第九题)方案Ⅱ

    导航Servlet和Listener集成一个程序为什么有问题前一篇总结最大的问题最终方案1.监听器2.Servlet实现3.实现前端JSP文件&#xff08;集成JS&#xff09;Servlet和Listener集成一个程序为什么有问题 在上一篇总结中我写到我看到这个题目的第一个想法是写出Servlet和Listener集成…...

    2024/4/28 2:33:37
  16. rg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name

    1、遇到的问题 控制台出现如下错误&#xff0c;具体报错见附件 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name orderController: Unsatisfied dependency expressed through field paymentClient; nested exception is …...

    2024/4/14 2:52:36
  17. (arduino框架)ESP32学习笔记1 如何输出可调频率和占空比的pwm波

    &#xff08;arduino框架&#xff09;ESP32学习笔记1: 如何输出可调频率和占空比的pwm波 &#xff08;1&#xff09;esp32使用pwm波的函数在esp32-hal-ledc.h文件当中定义&#xff0c;其中共有16个通道可配置 //channel 0-15 resolution 1-16bits freq limits depend on reso…...

    2024/4/14 2:52:31
  18. 2022-2028年全球与中国自动细胞分选机行业市场深度调研及投资预测分析

    本文研究全球与中国市场自动细胞分选机的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析自动细胞分选机的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...

    2024/4/25 21:16:32
  19. 全球及中国农业微量营养素行业商业模式分析及投资风险预测报告2022-2028年版

    本文研究全球与中国市场农业微量营养素的发展现状及未来发展趋势&#xff0c;分别从生产和消费的角度分析农业微量营养素的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场…...

    2024/4/14 2:52:21
  20. 李宏毅机器学习课程作业-HW1

    整篇文章是笔者自我一点点学习和理解其所给指导代码的记录学习。 在读取文件的时候使用了pandas.read_csv()函数&#xff0c;其中enconding的参数时“big5”&#xff0c;这是因为在这份文件中里面含有繁体字&#xff0c;使用“gbk”编码时会报错 data pd.read_csv(./train.c…...

    2024/4/18 15:42:20

最新文章

  1. C++ 多线程中捕捉异常

    有一个主线程&#xff0c;有一个子线程。主线程中调用子线程&#xff0c;并检查是否抛出异常&#xff0c;如果异常就处理异常信息。 主要思路&#xff1a;定义一个全局的std::exception_ptr对象&#xff0c;子线程抛异常时赋给该指针&#xff0c;主线程中检查该对象&#xff0…...

    2024/5/2 22:28:57
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 算法四十天-删除排序链表中的重复元素

    删除排序链表中的重复元素 题目要求 解题思路 一次遍历 由于给定的链表是排好序的&#xff0c;因此重复的元素在链表中的出现的位置是连续的&#xff0c;因此我们只需要对链表进行一次遍历&#xff0c;就可以删除重复的元素。 具体地&#xff0c;我们从指针cur指向链表的头节…...

    2024/5/1 13:07:13
  4. ssm框架中各层级介绍

    1、Spring&#xff08;业务逻辑层&#xff09;&#xff1a; Spring框架提供了依赖注入&#xff08;DI&#xff09;和面向切面编程&#xff08;AOP&#xff09;等功能&#xff0c;可以帮助管理Java应用程序中的对象依赖关系和提供横切关注点的支持。 在SSM框架中&#xff0c;S…...

    2024/4/30 2:49:54
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57