JDK1.8 新的特性

一 Lambda 使用

        Lambda表达式应用场景:任何有函数式接口的地方,只有一个抽象方法(Object类中的方法除外)的接口是函数式接口。就像Runnable接口中,只有一个run方法。

  • 1、Runnable
    	//在JDK1.8之前的写法new Thread(new Runnable() {public void run() {System.out.println("The runable  is using!");}}).start();//在JDK1.8之后可以使用lambda表达式new Thread(() -> System.out.println("It's a lambda function")).start();
    
  •  2、排序

对集合进行排序

 

        List<String> list = Arrays.asList("java","javascript","phpa","python");//在JDK1.8之前的写法Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.length()-o2.length();}});//在JDK1.8之后可以使用lambda表达式Collections.sort(list,(a,b)->a.length()-b.length());
  • 3.遍历

遍历集合中的元素 

        List<String> languages = Arrays.asList("Java","Python","C++");//在JDK1.8之前的写法for(String language:languages) {System.out.println(language);}//在JDK1.8之后可以使用lambda表达式languages.forEach(x -> System.out.println(x));

二 默认方法

  • 1.接口中的默认方法和静态方法

jdk1.8接口中允许包含具有具体实现的方法,该方法成为“默认方法”。默认方法使用defaut关键字修饰。

接口示例:
public interface IHello {void sayHi();//接口中的static方法static void sayHello(){System.out.println("static method: say hello");}//接口中的default方法default void sayByebye(){System.out.println("default mehtod: say byebye");}
}
实现类示例:public class HelloImpl implements IHello {@Overridepublic void sayHi() {System.out.println("normal method: say hi");}
}
  • 默认方法的原则

 默认具有“类优先”的原则,若一个接口中定义了一个默认的方法,而另一个父类或接口中又定义了一个同名的方法时,遵循如下的原则

  • 1.选择父类中的方法---如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略
示例:
public interface MyFunction{default String getName(){return "MyFunction";}
}public class MyClass{public String getName(){return "MyClass";}
}//创建SubClass类继承MyClass类,并实现MyFunction接口
public class SubClass extends MyClass implements MyFunction{
}
创建示例:public class SubClassTest{@Testpublic void testDefaultFunction(){SubClass subClass = new SubClass();System.out.println(subClass.getName());  //MyClass}
}
测试示例:
public class SubClassTest{@Testpublic void testDefaultFunction(){SubClass subClass = new SubClass();System.out.println(subClass.getName());  //MyClass}
}
  • 2.接口冲突,如果一个父类接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法,那么必须覆盖来解决冲突。
public interface MyFunction{default String getName(){return "function";}
}public interface MyInterface{default String getName(){return "interface";}
}

实现类MyClass同时实现MyFunction接口和MyInterface接口,里面同样的方法冲突,所以,MyClass必须覆盖getName的方法来解决冲突

//示例1
public class MyClass{//方法返回的是:interface@Overridepublic String getName(){return MyInterface.super.getName();}
}//示例2
public class MyClass{//方法返回的是:function@Overridepublic String getName(){return MyFunction.super.getName();}
}

三、Stream*

       Stream是Java8中处理集合的关键抽象概念,它可以 指定你希望对集合进行的操作,可以执行非常复杂的查找,过滤和映射数据等操作。简而言之,Stream API提供了一种高效且易于使用的处理数据的方式。

  • Stream的特性:

1.不是数据结构,不会存储元素;
2.不支持索引访问;
3.惰性求值/延迟执行,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算;
4.支持并行;
5.很容易生成数组或集合(List,Set);
6.支持过滤,查找,转换,汇总,聚合等操作;
7.不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中(保留意见:毕竟peek方法可以修改流中元素)

  • Stream的创建*

 

获取Stream(常用)
  在JDK1.8中, 集合接口有两个方法来生成流:
   1)stream() ,为集合创建串行流;
   2)parallelStream(),为集合创建并行流。stream()方法更常用一些。
   所有的Collection集合都可以通过stream默认方法获取流。Collection接口中加入了default方法stream用来获取流,所以其所有实现类均可获取流

	//List集合获取流List<String> list = new ArrayList<>();Stream<String> stream1 = list.stream();Stream<String> stream2 = list.parallelStream();//Set集合获取流Set<String> set = new HashSet<>();Stream<String> stream3 = set.stream();Stream<String> stream4 = set.parallelStream();

Map接口不是Collection的子接口,且其K-V数据结构不符合元素的单一特性,所以获取对应的流需要分key,value或者entry等情况

	Map<String, String> map = new HashMap<>();Stream<String> keyStream = map.keySet().stream();Stream<String> valueStream = map.values().stream();Stream<Map.Entry<String, String>> entryStream = map.entrySet().stream();

通过Arrays中静态方法stream()获取数组流

	//获取数组流的重载方法public static <T> Stream<T> stream(T[] array)public static Stream stream(T[] array)public static IntStream stream(int[] array)public static LongStream stream(long[] array)public static DoubleStream stream(double[] array)//示例Integer[] nums = new Integer[]{1,2,3,4,5,6,7,8,9};Stream<Integer> numStream = Arrays.stream(nums);

通过Stream类静态方法of()获取数组流,可以使用静态方法Stream.of()通过显示值创建一个流,它可以接收任意数量的参数。

Stream类中,提供了两个of()方法,一个只需要传入一个泛型参数,一个需要传入一个可变泛型参数

示例:

	String[] array = { "张三", "李四", "王五", "赵六" };Stream<String> stream = Stream.of(array);//of方法的参数其实是一个可变参数,所以支持数组Stream<String> stream1 = Stream.of(1, 2, 3, 4, 5);

Stream的中间操作

 中间操作在整体上可以分为:筛选与切片、映射、排序

 1.filter

功能:用于接收Lambda表达式,从六种排除某些元素。

Stream<Person> stream = list.stream().filter((e) -> {System.out.println("Stream API 中间操作");//过滤出年龄大于30的数据return e.getAge() > 30;
});

2.limit

	//功能:截断流,使其元素不超过给定数量。方法定义:Stream<T> limit(long maxSize);//过滤之后取2个值list.stream().filter((e) -> e.getAge() >30 ).limit(2).forEach(System.out ::println);

3.skip

	//跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流//方法定义:Stream<T> skip(long n);//跳过前2个值list.stream().skip(2).forEach(System.out :: println);

4.distinct--需要重写hashCode() 和equals()方法才可以使用

	//筛选,通过流所生成元素的 hashCode() 和 equals() 去 除重复元素。//方法定义:Stream<T> distinct();//示例list.stream().distinct().forEach(System.out :: println);

排序*

	// 自然排序Arrays.asList(1,2,3,4,5,6).stream().sorted((a,b)->b-a).forEach(System.out::println);
结果:
6
5
4
3
2
1定制排序://定制排序List<Employee> persons1 = list.stream().sorted((e1, e2) -> {if (e1.getAge() == e2.getAge()) {return 0;} else if (e1.getAge() > e2.getAge()) {return 1;} else {return -1;}}).collect(Collectors.toList());

查找与匹配*

allMatch:表示检查是否匹配所有元素

只有所有的元素都匹配条件时, allMatch()方法才会返回true

	boolean match = employees.stream().allMatch((e) -> Employee.Stauts.SLEEPING.equals(e.getStauts()));System.out.println(match);

anyMatch:表示检查是否至少匹配一个元素。只要有任意一个元素符合条件,anyMatch()方法就会返回true

	boolean match = employees.stream().anyMatch((e) -> Employee.Stauts.SLEEPING.equals(e.getStauts()));System.out.println(match);

noneMatch:表示检查是否没有匹配所有元素

	boolean match = employees.stream().noneMatch((e) -> Employee.Stauts.SLEEPING.equals(e.getStauts()));System.out.println(match);

findFirst:表示返回第一个元素

	Optional<Employee> op = employees.stream().sorted((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())).findFirst();System.out.println(op.get());

findAny :返回当前流中任意元素

	Optional<Employee> op = employees.stream().filter((e) -> Employee.Stauts.WORKING.equals(e.getStauts())).findFirst();System.out.println(op.get());

count:返回流中元素总数

	long count = employees.stream().count();System.out.println(count);

max:返回流中最大值

示例:Optional<Employee> op = employees.stream().max((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
System.out.println(op.get());

min:返回流中最小值

	Optional<Double> op = employees.stream().map(Employee::getSalary).min(Double::compare);System.out.println(op.get());

forEach:表示内部迭代

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

规约

reduce方法的功能,简单来说就是根据一定的规则将stream中的元素进行计算后返回一个唯一的值。

	Integer reduce = Arrays.asList(1, 2, 3, 4, 5).stream().reduce((a, b) -> a + b).get();System.out.print(reduce);   //15

收集

Collect接口中方法的实现决定了如何对流执行收集操作,(List,Set,Map)Collectors 实用类提供了很多静态方法,可以方便创建常见收集器实例。

 

 

	//将过滤后的元素存储到ListList<Integer> collect = Arrays.asList(1, 2, 3, 4, 5).stream().filter(x -> x % 2 == 0).collect(Collectors.toList());System.out.print(collect.toString()); //[2, 4]

新日期类

在旧版的Java中,日期时间API存在问题,其中:

非线程安全:java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一

时区处理麻烦:日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但这些类也有线程安全等问题。

LocalDate、 LocalTime、 LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。 ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法。

具体的示例

	// 获取当前系统时间LocalDateTime localDateTime1 = LocalDateTime.now();// 2019-10-27T13:49:09.483System.out.println(localDateTime1);// 指定日期时间LocalDateTime localDateTime2 = LocalDateTime.of(2019, 10, 27, 13, 45,10);System.out.println(localDateTime2);// 2019-10-27T13:45:10LocalDateTime localDateTime3 = localDateTime1// 加三年.plusYears(3)// 减三个月.minusMonths(3);// 2022-07-27T13:49:09.483System.out.println(localDateTime3);// 2019System.out.println(localDateTime1.getYear());  // 10  System.out.println(localDateTime1.getMonthValue());// 27 System.out.println(localDateTime1.getDayOfMonth()); // 13System.out.println(localDateTime1.getHour());// 52    System.out.println(localDateTime1.getMinute());  // 6System.out.println(localDateTime1.getSecond());   LocalDateTime localDateTime4 = LocalDateTime.now();// 2019-10-27T14:19:56.884System.out.println(localDateTime4);   LocalDateTime localDateTime5 = localDateTime4.withDayOfMonth(10);// 2019-10-10T14:19:56.884System.out.println(localDateTime5);   

 Instant:用于“时间戳”的运算,它是以Unix元年开始所经历的描述进行运算的

	// 默认获取UTC时区Instant instant1 = Instant.now();// 2019-10-27T05:59:58.221Z  System.out.println(instant1);// 偏移量运算OffsetDateTime offsetDateTime = instant1.atOffset(ZoneOffset.ofHours(8));// 2019-10-27T13:59:58.221+08:00System.out.println(offsetDateTime);// 获取时间戳// 1572156145000System.out.println(instant1.toEpochMilli());// 以Unix元年为起点,进行偏移量运算Instant instant2 = Instant.ofEpochSecond(60);// 1970-01-01T00:01:00ZSystem.out.println(instant2);
Duration和Period

Duration是用于计算两个“时间”间隔,Period是用于计算两个“日期”间隔

	Instant instant_1 = Instant.now();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}Instant instant_2 = Instant.now();Duration duration = Duration.between(instant_1, instant_2);System.out.println(duration.toMillis());// 1000LocalTime localTime_1 = LocalTime.now();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}LocalTime localTime_2 = LocalTime.now();// 1000System.out.println(Duration.between(localTime_1, localTime_2).toMillis());LocalDate localDate_1 = LocalDate.of(2018,9, 9);LocalDate localDate_2 = LocalDate.now();Period period = Period.between(localDate_1, localDate_2);// 1System.out.println(period.getYears());// 1    System.out.println(period.getMonths());   // 18System.out.println(period.getDays());    

时区

Java8 中加入了对时区的支持,带时区的时间分别为:ZonedDate、 ZonedTime、ZonedDateTime。其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式,例如 : Asia/Shanghai 等。

// 通过时区构建LocalDateTime
LocalDateTime localDateTime1 =
LocalDateTime.now(ZoneId.of("America/El_Salvador"));
// 2019-10-27T00:46:21.268
System.out.println(localDateTime1);// 以时区格式显示时间
LocalDateTime localDateTime2 = LocalDateTime.now();
ZonedDateTime zonedDateTime1 =
localDateTime2.atZone(ZoneId.of("Africa/Nairobi"));
// 2019-10-27T14:46:21.273+03:00[Africa/Nairobi]
System.out.println(zonedDateTime1);

Optional*

在开发过程中,NullPointerException可谓是随时随处可见,为了避免空指针异常,常常需要进行一些防御式的检查,所以在代码中常常可见if (null != obj)这样的判断。

  在JDK1.8中,Java提供了一个Optional类,Optional类能让我们省掉繁琐的非空的判断。Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
  Optional类中的方法:

  • of

 

    //创建一个值为one的String类型的OptionalOptional<String> ofOptional = Optional.of("one");//如果我们用of方法创建Optional对象时,所传入的值为null,则抛出NullPointerExceptionOptional<String> nullOptional = Optional.of(null);
异常信息:
Exception in thread "main" java.lang.NullPointerExceptionat java.util.Objects.requireNonNull(Objects.java:203)at java.util.Optional.<init>(Optional.java:96)at java.util.Optional.of(Optional.java:108)at com.test.TestDemo.main(TestDemo.java:25)
  • ofNullable

 

    //为指定的值创建Optional对象,不管所传入的值为null不为null,创建的时候都不会报错Optional<String> nullOptional = Optional.ofNullable(null);Optional<String> nullOptional2 = Optional.ofNullable("two");

empty

    //创建一个空的String类型的Optional对象Optional<String> emptyOptional = Optional.empty();
isPresent
可以使用这个isPresent()方法检查一个Optional对象中是否有值,只有值非空才返回true

	//在Java8之前,我们一般使用如下方式来检查空值if(name != null){System.out.println(name.length);}//在Java8中,我们就可以使用如下方式来检查空值Optional<String> opt = Optional.of("asd");opt.ifPresent(name -> System.out.println(name.length()));
orElse和orElseGet*

 orElse()方法用来返回Optional对象中的默认值,它被传入一个“默认参数‘。如果对象中存在一个值,则返回它,否则返回传入的“默认参数”。

    Optional<String> stringOptional = Optional.of("four");//fourSystem.out.println(stringOptional.orElse("five"));Optional<String> emptyOptional = Optional.empty();//sixSystem.out.println(emptyOptional.orElse("six"));

如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值。orElseGet与orElse()方法类似,但是这个函数不接收一个“默认参数”,而是一个函数接口

    Optional<String> stringOptional = Optional.of("seven");//sevenSystem.out.println(stringOptional.orElseGet(() -> "eight"));Optional<String> emptyOptional = Optional.empty();//nineSystem.out.println(emptyOptional.orElseGet(() -> "nine"));
orElseThrow:

  如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常:

public class TestDemo {public static void main(String[] args) throws InterruptedException {Optional<String> stringOptional = Optional.of("张三");System.out.println(stringOptional.orElseThrow(CustomException::new));Optional<String> emptyOptional = Optional.empty();System.out.println(emptyOptional.orElseThrow(CustomException::new));}
}class CustomException extends RuntimeException {private static final long serialVersionUID = -4399699891687593264L;public CustomException() {super("自定义异常");}public CustomException(String message) {super(message);}
}结果:
张三
Exception in thread "main" com.test.CustomException: 自定义异常at java.util.Optional.orElseThrow(Optional.java:290)at com.test.TestDemo.main(TestDemo.java:26)
map:如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()。
flagMap:如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象。
flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional,map方法的mapping函数返回值可以是任何类型T。调用结束时,flatMap不会对结果用Optional封装。
    //map方法中的lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional。 //但flatMap方法中的lambda表达式返回值必须是Optionl实例Optional<String> stringOptional = Optional.of("zhangsan");//lisiSystem.out.println(stringOptional.flatMap(e -> Optional.of("lisi")).orElse("失败"));stringOptional = Optional.empty();//失败System.out.println(stringOptional.flatMap(e -> Optional.empty()).orElse("失败"));
使用Optional处理空指针

 

1、对于Integer的判空
  可以使用Optional.ofNullable来构造一个Optional,然后使用orElse(0)把null 替换为默认值再进行+1操作。
2、对于 String 和字面量的比较
  可以把字面量放在前面,比如"OK".equals(s),这样即使s是null也不会出现空指针异常;而对于两个可能为null的字符串变量的equals比较,可以使用Objects.equal,它会做判空处理。
3、对于 ConcurrentHashMap,既然其Key和Value都不支持null,修复方式就是不要把null存进去
  HashMap的Key和Value可以存入null,而ConcurrentHashMap看似是HashMap的线程安全版本,却不支持null值的Key和Value,这是容易产生误区的一个地方。
4、对于类似fooService.getBarService().bar().equals(“OK”)的级联调用
  需要判空的地方有很多,包括fooService、getBarService()方法的返回值,以及bar方法返回的字符串。如果使用if-else来判空的话可能需要好几行代码,但使用Optional的话一行代码就够了。
5、对于返回的List
  由于不能确认其是否为null,所以在调用size方法获得列表大小之前,同样可以使用Optional.ofNullable包装一下返回值,然后通过orElse(Collections.emptyList())实现在List为null的时候获得一个空的List,最后再调用size方法。

	private List<String> rightMethod(FooService fooService, Integer i, String s, String t) {log.info("result {} {} {} {}", Optional.ofNullable(i).orElse(0) + 1, "OK".equals(s), Objects.equals(s, t), new HashMap<String, String>().put(null, null));Optional.ofNullable(fooService).map(FooService::getBarService).filter(barService -> "OK".equals(barService.bar())).ifPresent(result -> log.info("OK"));return new ArrayList<>();}@GetMapping("right")public int right(@RequestParam(value = "test", defaultValue = "1111") String test) {return Optional.ofNullable(rightMethod(test.charAt(0) == '1' ? null : new FooService(),test.charAt(1) == '1' ? null : 1,test.charAt(2) == '1' ? null : "OK",test.charAt(3) == '1' ? null : "OK")).orElse(Collections.emptyList()).size();}

使用判空方式或Optional方式来避免出现空指针异常,不一定是解决问题的最好方式,空指针没出现可能隐藏了更深的Bug

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551734.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

养老院管理系统(含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 养老院管理系统拥有两种角色&#xff1a;管理员和护工 管理员&#xff1a;用户管理、老人信息管理、事故记录管理、入住费用管理、护工薪资管理、护工请假管理、床位管理、请假管理等 护…

【机器学习基础】Transformer学习

Transformer学习 梯度消失FeedForward层激活函数的主要作用是在网络中加入非线性变换 梯度消失 梯度爆炸 FeedForward层 Transformer结构: Transformer结构主要分为两大部分: 一是Encoder层结构:Encoder 的输入由 Input Embedding 和 Positional Embedding 求和输入Multi…

大模型部署——NVIDIA NIM 和 LangChain 如何彻底改变 AI 集成和性能

DigiOps与人工智能 人工智能已经从一个未来主义的想法变成了改变全球行业的强大力量。人工智能驱动的解决方案正在改变医疗保健、金融、制造和零售等行业的企业运营方式。它们不仅提高了效率和准确性&#xff0c;还增强了决策能力。人工智能的价值不断增长&#xff0c;这从它处…

汽修行业的知识库搭建:赋能在线教育与知识付费

随着汽修行业的蓬勃发展&#xff0c;其业务范围和技术要求日益多元化。为了应对这一趋势&#xff0c;许多汽修公司开始探索线上教育模式&#xff0c;通过开设汽修知识课程&#xff0c;实现知识的有偿分享与传播。这一转变不仅拓宽了企业的盈利渠道&#xff0c;也为广大汽修爱好…

环境变量

见一见环境变量&#xff1a; 查看环境变量的命令 命令行&#xff1a; echo &PATH echo &HOME env ps ajx ps aux ps -f -o pid code.c中获取环境变量 main&#xff08;char* env[]&#xff09; char* getenv&#xff08;env_name&#xff09; 本地变量 shell…

腾讯云新开端口

检查防火墙设置 890 2024-09-30 20:47:18 netstat -tuln | grep 1213891 2024-09-30 20:47:49 ping 110.40.130.231892 2024-09-30 20:48:38 sudo firewall-cmd --zonepublic --add-port1213/tcp --permanent893 2024-09-30 20:48:51 sudo firewall-cmd --reload894 2024-…

[Everything] 文件搜索工具的下载及详细安装使用过程(附有下载文件)

快速搜索文件名及其所在路径 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压后得到文件 双击exe文件得到 选择简体中文&#xff0c;点击OK 点击“我接受” 更改安装目录&#xff0c;最好不要放在C盘&#xff0c;点击下一步 点击下一步 点…

动态时钟控件:Qt/C++ 项目代码解读

基于Qt的动态时钟控件项目。该项目展示了如何通过Qt的绘图系统绘制一个带有表盘背景、时针、分针、秒针、以及时间日期显示的时钟。同时&#xff0c;这个时钟控件支持背景切换&#xff0c;并且每秒钟刷新一次&#xff0c;实时显示当前时间。 项目结构与功能概述 该时钟控件主…

如何利用 StarRocks 加速 Iceberg 数据湖的查询效率

数据湖作为一种存储各种类型数据的集中式存储系统&#xff0c;以其灵活性、可扩展性和低成本的优势受到越来越多企业的青睐。然而&#xff0c;数据湖虽然降低了数据存储成本&#xff0c;但在数据分析尤其是实时数据分析场景下&#xff0c;其性能仍存在一定瓶颈。 本文将探讨如何…

Python的异步编程

什么是协程&#xff1f; 协程不是计算机系统提供&#xff0c;程序员人为创造。 协程也可以被称为微线程&#xff0c;是一种用户态内的上下文切换技术。简而言之&#xff0c;其实就是通过一个线程实现代码块相互切换执行。 实现协程有那么几种方法&#xff1a; greenlet&…

Windows——解除Windows系统中文件名和目录路径的最大长度限制

第一步&#xff1a;打开本地组策略编辑器 按下Win R键打开运行窗口&#xff0c;输入 gpedit.msc 并回车&#xff0c;打开本地组策略编辑器。 第二步&#xff1a;开启 长路径设置 第三步&#xff1a;重启计算机

全新带货思路,用AI美女数字人做情感赛道,27天销量1559单

本期就另外分享一个全新的AI美女数字人带货思路&#xff0c;如果你正好对AI视频带货感兴趣&#xff0c;那么本期内容直接给你抹平“视频号上AI美女数字人玩法信息差”&#xff0c;最主要还是趁这类内容还不卷的时候&#xff0c;赶紧行动起来&#xff01; 更多实操教程和数字人工…

Paper解读:工作场所人机协作的团队形成:促进组织变革的目标编程模型

人工智能&#xff08;AI&#xff09;具有降低运营成本、提高效率和改善客户体验的潜力。 因此&#xff0c;在组织中组建项目团队至关重要&#xff0c;这样他们就会在决策过程中欢迎人工智能。 当前的技术革命要求公司快速变革&#xff0c;并增加了对团队在促进创新采用方面的作…

Chromium 屏蔽“缺少 Google API 密钥,因此 Chromium 的部分功能将无法使用。”提示 c++

新编译的Chromium工程默认gn参数如下: 可以利用gn args --list out/debug >1.txt 导出默认参数 google_api_key Current value (from the default) "" From //google_apis/BUILD.gn:43 Set these to bake the specified API keys and OAuth client …

【IT001】基于springboot+vue实现的在线问卷调查网站系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 在当今信息爆炸的时代&#xff0c;数据收集与分析的重要…

经典文献阅读之--Stereo-NEC(全新双目VIO初始化)

0. 简介 双目VI-SLAM初始化方法分为两种类型&#xff1a;联合方法和分离方法。联合方法通过融合视觉观测和IMU积分来同时处理视觉和惯性参数&#xff0c;但有可能在闭合解中忽视陀螺仪偏置&#xff0c;而且计算成本高。分离方法首先独立解决SfM问题&#xff0c;然后根据纯视觉…

Qt --- 常用控件的介绍---Widget属性介绍

一、控件概述 编程&#xff0c;讲究的是站在巨人的肩膀上&#xff0c;而不是从头发明轮子。一个图形化界面上的内容&#xff0c;不需要咱们全都从零区实现&#xff0c;Qt中已经提供了很多内置的控件了&#xff08;按钮&#xff0c;文本框&#xff0c;单选按钮&#xff0c;复选…

CMake教程(八):添加定制命令和生成的文件

本篇继续 CMake 官网教程的第八篇教程&#xff0c;所用材料是 Step8 目录下的源代码。 本篇教程主要讲解如何通过 CMake 生成一个头文件&#xff0c;该头文件当中包含了 1 到 10 的平方根表格&#xff0c;然后在程序的其它部分包含这个生成的头文件。 出于教学的目的&#xf…

手机实时提取SIM卡打电话的信令声音-新的篇章(二、USB音频线初步探索)

手机实时提取SIM卡打电话的信令声音-新的篇章(二、USB音频线初步探索) 前言 前面的篇章和方案中,我们从架构拓扑和原理的角度分析了使用音频线来绕开手机对SIM卡电话的通话声音的封锁场景的可行性,并尝试拆分和对比模拟3.5mm耳机的音频和USB的数字音频线在使用上的差异。 在…

【ADC】系统误差分析中的统计原理

概述 本文学习于TI 高精度实验室课程&#xff0c;讨论典型和最大数据表规格的统计含义&#xff0c;分析最坏情况分析和查看典型值的统计分析之间的差异。 文章目录 概述一、最坏情况下的误差大小及其概率二、估计误差更好的方法 一、最坏情况下的误差大小及其概率 为了更好地…