当前位置: 首页 > news >正文

网站开发方案书博客yum安装wordpress

网站开发方案书博客,yum安装wordpress,外贸网站优化谷歌关键词排名,怎么用ai做网站版面【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作 前言Lambda函数式编程Stream流对集合数据操作#xff08;一#xff09;创建Stream流#xff08;二#xff09;中间操作之filter#xff08;三#xff09;中间操作之map#xff08;四#xff09… 【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作 前言Lambda函数式编程Stream流对集合数据操作一创建Stream流二中间操作之filter三中间操作之map四中间操作之distinct五中间操作之sorted六中间操作之limit七中间操作之skip八中间操作之flatMap九终结操作之forEach十终结操作之count十一终结操作之maxmin十二终结操作之collect十三终结操作之anyMatchallMatchnoneMatch十四终结操作之findAny十五终结操作之findFirst十六终结操作之reduce十七并行流 Optional包装类函数式接口最后 前言 以下知识总结是笔者在b站上学完了相关课程视频总结而来。有意者可直接通过点击下面链接 【Lambda表达式Stream流-函数式编程-java8函数式编程(Lambda表达式OptionalStream流)从入门到精通-最通俗易懂】 访问三更草堂课程进行视频学习。 Lambda函数式编程 Lambda表达式是Java 8中引入的一个重要特性它可以用更简洁的方式来表示匿名函数或闭包使得代码更加简洁和易读。Lambda表达式可以被视为一个匿名函数它可以作为参数传递给方法或存储在变量中并且可以在需要时被调用。 Lambda表达式的语法如下 (parameter1,parameter2) - expression // 或 parameter - expression // 或 parameter - { statements; } // 或 (parameter1,parameter2) - { statements; }其中参数列表(parameter1,parameter2)是一个逗号分隔的参数列表箭头符号-将参数列表和Lambda表达式的主体部分分隔开来。Lambda表达式的主体可以是一个表达式或者一段代码块。 用建立线程的程序可以举例如下 public static void main(String[] args) {// 新线程的建立 匿名内部类的方法new Thread(new Runnable() {public void run() {System.out.println(LambdaDemo01新线程运行);}}).start();//优化 lambda方式new Thread(() - { System.out.println(LambdaDemo01新线程优化运行); }).start();//继续优化new Thread(() - System.out.println(LambdaDemo01新线程继续优化运行)).start();}Stream流对集合数据操作 在Java中Stream是用来处理集合数据的工具它引入自Java 8并提供了一种更加便利和高效的方式来对集合进行操作。Stream提供了一系列的操作方法可以对集合进行过滤、映射、排序、聚合等操作同时还支持并行处理可以充分利用多核处理器的性能。 注意事项 惰性求值 (如果没有终结操作中间操作是不会得到执行的)流是一次性的(一旦一个流对象经过一个终结操作后。这个流就不能再被使用)不会影响原数据(我们在流中可以多数据做很多处理。但是正常情况下是不会影响原来集合中的元素的。这往往也是我们期望的 先准备一个集合数据方便接下来在程序举例中用到。 Data NoArgsConstructor AllArgsConstructor EqualsAndHashCode//用于后期的distinct去重使用 public class Author{//idprivate Long id;//姓名private String name;//年龄private Integer age;//简介private String intro;//作品private ListBook books; }Data NoArgsConstructor AllArgsConstructor EqualsAndHashCode//用于后期的distinct去重使用 public class Book {//idprivate Long id;//书名private String name;//分类private String category;//评分private Integer score;//简介private String intro; }private static ListAuthor getAuthors(){//数据初始化Author author1 new Author(1L,蒙多,33,一个从菜刀中明悟哲理的祖安人,null);Author author2 new Author(2L,亚拉索,15,狂风也追逐不上他的思考速度,null);Author author3 new Author(3L,易,14,是这个世界在限制他的思维,null);Author author4 new Author(3L,易,14,是这个世界在限制他的思维,null);//书籍列表ListBook books1 new ArrayList();ListBook books2 new ArrayList();ListBook books3 new ArrayList();books1.add(new Book(1L,刀的两侧是光明与黑暗,哲学,爱情,88,用一把刀划分了爱恨));books1.add(new Book(2L,一个人不能死在同一把刀下,个人成长,爱情,99,讲述如何从失败中明悟真理));books2.add(new Book(3L,那风吹不到的地方,哲学,85,带你用思维去领略世界的尽头));books2.add(new Book(3L,那风吹不到的地方,哲学,85,带你用思维去领略世界的尽头));books2.add(new Book(4L,吹或不吹,爱情,个人传记,56,一个哲学家的恋爱观注定很难把他所在的时代理解));books3.add(new Book(5L,你的剑就是我的剑,爱情,56,无法想象一个武者能对他的伴侣这么的宽容));books3.add(new Book(6L,风与剑,个人传记,100,两个哲学家灵魂和肉体的碰撞会激起怎么样的火花呢?));books3.add(new Book(6L,风与剑,个人传记,100,两个哲学家灵魂和肉体的碰撞会激起怎么样的火花呢?));author1.setBooks(books1);author2.setBooks(books2);author3.setBooks(books3);author4.setBooks(books3);ListAuthor authorlist new ArrayList(Arrays.asList(author1,author2,author3,author4));return authorlist;}一创建Stream流 可以通过多种方式来创建Stream流。以下是一些常见的创建Stream流的方式 private static void test02(){// 创建流Integer[] arr {1, 2, 3, 4, 5};StreamInteger stream Arrays.stream(arr); //Stream.of(arr)stream.distinct().filter(integer - integer2).forEach(integer - System. out.println(integer));//双列集合创建流MapString,Integer map new HashMap();map.put(蜡笔小新,19);map.put(黑子,17);map.put(日向翔阳,16);StreamMap.EntryString, Integer streamDD map.entrySet().stream();streamDD.filter(entry - entry.getValue() 19).forEach(entry - System.out.println(entry));}Stream流对集合操作是一种链式编程的方式以创建获取Stream流为开始操作这里可以通过中间操作和终结操作进行分类分点总结。 二中间操作之filter filter起到的是过滤的作用通过判断数据是否满足要求来进行过滤。程序举例如下 private static void test03(){ListAuthor authors getAuthors();//打印所有姓名长度大于1的作家的姓名authors.stream().distinct().filter(author - author.getName().length()1).forEach(author - System.out.println(author.getName()));//testAnd 打印所有姓名长度大于1且年龄大于14的作家的姓名authors.stream().distinct().filter(((PredicateAuthor) author - author.getName().length() 1).and(author - author.getAge()14)).forEach(author - System.out.println(author.getName()));//testOr 打印所有姓名长度大于1或年龄大于14的作家的姓名authors.stream().distinct().filter(((PredicateAuthor) author - author.getName().length() 1).or(author - author.getAge()14)).forEach(author - System.out.println(author.getName()));//testNegate 打印作家中年龄不大于I7的作家authors.stream().distinct().filter(((PredicateAuthor) author - author.getAge() 17).negate()).forEach(author - System.out.println(author.getName()));}三中间操作之map map的作用是更改流中的元素程序举例如下 private static void test04(){ListAuthor authors getAuthors();//打印所有作家的姓名//用foreach 直接输出authors.stream().forEach(author - System.out.println(author.getName()));//用map 可以更改流里的元素 再进行输出authors.stream().map(author - author.getName()).forEach(name - System.out.println(name));//一些情况根据更改元素的类型可以提高效率authors.stream().mapToInt(author - author.getAge()).forEach(age - System.out.println(age));}四中间操作之distinct distinct起到的作用是对数据进行去重distinct方法是依赖Obiect的equals方法来判断是否是相同对象的。所以需要注意重写数据的equals方法。 private static void test05(){ListAuthor authors getAuthors();//打印所有作家的姓名并且要求其中不能有重复元素。authors.stream().map(author - author.getName()).distinct().forEach(name - System.out.println(name));}五中间操作之sorted sorted起到的是排序的作用程序举例如下 private static void test06(){ListAuthor authors getAuthors();//对流中的元素按照年龄进行降序排序并且要求不能有重复的元素authors.stream().distinct().sorted((author1,author2) - author2.getAge() - author1.getAge()) //如果调用空参的sorted0方法 需要流中的元素是实现了Comparable.forEach(author - System.out.println(author.getAge()));//Comparator优化升序可用降序的话需要同上写法authors.stream().distinct().sorted(Comparator.comparingInt(Author::getAge)) //如果调用空参的sorted0方法 需要流中的元素是实现了Comparable.forEach(author - System.out.println(author.getAge()));}六中间操作之limit limit可以设置流的最大长度超出的部分将被抛弃。程序举例如下 private static void test07(){ListAuthor authors getAuthors();//对流中的元素按照年龄进行降序排序并且要求不能有重复的元素然后打印其中年龄最大的两个作家的姓名。authors.stream().distinct().sorted((author1,author2) - author2.getAge() - author1.getAge()) //如果调用空参的sorted方法 需要流中的元素是实现了Comparable.limit(2).forEach(author - System.out.println(author.getName()));}七中间操作之skip skip可以跳过流中的前n个元素返回剩下的元素。程序举例如下 private static void test08(){ListAuthor authors getAuthors();//打印除了年龄最大的作家外的其他作家要求不能有重复元素并且按照年龄降序排序。authors.stream().distinct().sorted((author1,author2) - author2.getAge() - author1.getAge()) //如果调用空参的sorted0方法 需要流中的元素是实现了Comparable.skip(1).forEach(author - System.out.println(author.getName()));}八中间操作之flatMap map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素类似于展开操作的作用。程序举例如下 private static void test09(){ListAuthor authors getAuthors();//打印所有书籍的名字。要求对重复的元素进行去重.authors.stream().flatMap(author - author.getBooks().stream()).map(book - book.getName()).distinct().forEach(name - System.out.println(name));}九终结操作之forEach forEach对流中的元素进行遍历操作我们通过传入的参数去指定对遍历到的元素进行什么具体操作。程序举例如下 private static void test10(){ListAuthor authors getAuthors();//输出所有作家的名字authors.stream().map(Author::getName).distinct().forEach(name - System.out.println(name));}十终结操作之count count可以用来获取当前流中元素的个数。程序举例如下 private static void test11(){ListAuthor authors getAuthors();//打印这些作家的所出书籍的数目注意删除重复元素long count authors.stream().flatMap(author - author.getBooks().stream()).distinct().count();System.out.println(count);}十一终结操作之maxmin maxmin可以用来获取流中的最值。程序举例如下 private static void test12(){ListAuthor authors getAuthors();//分别获取这些作家的所出书籍的最高分和最低分并打印。long max authors.stream().flatMap(author - author.getBooks().stream()).max(Comparator.comparingInt(Book::getScore)).get().getScore();System.out.println(max);long min authors.stream().flatMap(author - author.getBooks().stream()).min(Comparator.comparingInt(Book::getScore)).get().getScore();System.out.println(min);}十二终结操作之collect collect可以把当前流转换成一个集合。程序举例如下 private static void test13(){ListAuthor authors getAuthors();//获取一个存放所有作者名字的List集合ListString authorNameList authors.stream().map(Author::getName).distinct().collect(Collectors.toList());//获取一个所有书名的Set集合。SetBook bookNameSet authors.stream().flatMap(author - author.getBooks().stream()).collect(Collectors.toSet());//获取一个map集合map的key为作者名value为ListBookMapString, ListBook authorBookMap authors.stream().distinct().collect(Collectors.toMap(Author::getName, Author::getBooks));}十三终结操作之anyMatchallMatchnoneMatch anyMatch可以用来判断是否有任意符合匹配条件的元素结果为boolean类型。如果都符合结果为true否则结果为false。 allMatch可以用来判断是否都符合匹配条件结果为boolean类型。如果都符合结果为true否则结果为false。 noneMatch可以判断流中的元素是否都不符合匹配条件。如果都不符合结果为true否则结果为false。 程序举例如下 private static void test16(){ListAuthor authors getAuthors();//判断是否有年龄在29以上的作家boolean isExitSomeKindAuthor authors.stream().anyMatch(author - author.getAge() 29);ListAuthor authors getAuthors();//判断是否所有的作家都是成年人boolean isAllAdult authors.stream().allMatch(author - author.getAge()18);ListAuthor authors getAuthors();//判断作家是否都没有超过100岁的。boolean isAllLowerHundrenAge authors.stream().noneMatch(author - author.getAge()100);}十四终结操作之findAny findAny获取流中的任意一个元素。程序举例如下 private static void test17(){ListAuthor authors getAuthors();//获取任意一个大于18的作家如果存在就输出他的名字authors.stream().filter(author - author.getAge() 18).findAny().ifPresent(author - System.out.println(author.getName())); //ifPresent 如果存在}十五终结操作之findFirst 获取流中的第一个元素。程序举例如下 private static void test18(){ListAuthor authors getAuthors();//获取一个年龄最小的作家并输出他的姓名String name authors.stream().sorted(Comparator.comparingInt(Author::getAge)).findFirst().get().getName();System.out.println(name);}十六终结操作之reduce reduce的作用是把stream中的元素给组合起来我们可以传入一个初始值它会按照我们的计算方式依次拿流中的元素和在初始化值的基础上进行计算计算结果再和后面的元素计算。 reduce原理示意 T result identity; for (T element : this stream)result accumulator .apply(resultelement) return result;使用时程序举例如下 private static void test19(){ListAuthor authors getAuthors();//使用reduce求所有作者年龄的和Integer sum authors.stream().distinct().map(author - author.getAge()).reduce(0,(result, element) - Math.addExact(result,element));System.out.println(sum);//使用reduce求所有作者中年龄的最大值Integer max authors.stream().distinct().map(author - author.getAge()).reduce(Integer.MIN_VALUE,(result, element) - Math.max(result,element));System.out.println(max);//使用reduce求所有作者中年龄的最小值Integer min authors.stream().distinct().map(author - author.getAge()).reduce(Integer.MAX_VALUE,(result, element) - Math.min(result,element));System.out.println(min);}十七并行流 当流中有大量元素时我们可以使用并行流去提高操作的效率。其实并行流就是把任务分配给多个线程去完成。如果我们自己去用代码实现的话其实会非常的复杂并且要求你对并发编程有足够的理解和认识。而如果我们使用Stream的话我们只需要修改一个方法的调用就可以使用并行流来帮我们实现从而提高效率。 程序示例如下 parallel方法可以把串行流转换成并行流 也可以通过parallelStream直接获取并行流对象 private static void test20() {StreamInteger stream Stream.of(1,2,3,4, 5,6,7,8,9,10);Integer sum stream.parallel().peek(num - System.out.println(numThread.currentThread().getName())) //通常用于调试和日志记录可以在peek()中输出元素的信息或者对元素进行一些检查操作。.filter(num - num 5).reduce((result, ele) - result ele).get() ;System.out.println(sum);Integer sum1 Arrays.asList(1,2,3,4, 5,6,7,8,9,10).parallelStream().peek(num - System.out.println(numThread.currentThread().getName())) //通常用于调试和日志记录可以在peek()中输出元素的信息或者对元素进行一些检查操作。.filter(num - num 5).reduce((result, ele) - result ele).get();System.out.println(sum1);}Optional包装类 Optional类似于包装类可以把我们的具体数据封装Optional对象内部。然后我们去使用Optional中封装好的方法操作封装进去的数据就可以非常优雅的避免空指针异常。 Stream中的一些操作可能会返回Optional类型的结果比如findFirst()、findAny()等操作这些操作可能会返回一个包含结果的Optional对象或者一个空的Optional对象。另外Stream也提供了一些操作可以将Optional对象转换为Stream比如Stream.ofNullable()方法可以将一个Optional对象转换为包含该对象的Stream。因此Optional和Stream在处理可能为空的值时可以相互配合使用。 以下是Optional的一些使用示例 public class OptionalDemo {public static void main(String[] args) {test04();}/** 创建对象* 我们一般使用Optional的静态方法ofNullable来把数据封装成一个Optional对象。无论传入的参数是否为nul都不会出现问题。*/private static void test01() {OptionalAuthor authorOptional getAuthorOptional();authorOptional.ifPresent(author - System.out.println(author.getName()));}private static OptionalAuthor getAuthorOptional(){Author author new Author(1L,蒙多,33,一个从菜刀中明悟哲理的祖安人,null);// Optional.of(T) 无法排除空指针报错情况,或者return author nul1?Optional.empty() :Optional.of(author)return Optional.ofNullable(author);}/** 获取值* 可以使用get方法获取但是不推荐。因为当Optional内部的数据为空的时候会出现异堂* orElseGet 获取数据并且设置数据为空时的默认值。* orElseThrow 获取数据如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建异常抛出。*/private static void test02() {OptionalAuthor authorOptional getAuthorOptional();String name authorOptional.orElseGet(() - new Author()).getName();System.out.println(name);String name1 authorOptional.orElseThrow(() - new RuntimeException(数据为null)).getName();System.out.println(name1);}/** 过滤* 我们可以使用filter方法对数据进行过滤。* 如果原本是有数据的但是不符合判断也会变成一个无数据的Optional对象。**/private static void test03() {OptionalAuthor authorOptional getAuthorOptional();String name authorOptional.filter(author - author.getAge() 100).orElseGet(() - new Author()).getName();System.out.println(name);}/** 判断* 我们可以使用isPresent方法进行是否存在数据的判断。如果为空返回值为false,如果不为空返回值为true。但是这种方式并不能体现* Optional的好处更推荐使用ifPresent方法。*/private static void test04() {OptionalAuthor authorOptional getAuthorOptional();// isPresentif (authorOptional.isPresent()){System.out.println(authorOptional.get().getName());}// ifPresentauthorOptional.ifPresent(author - System.out.println(author.getName()));}/** 数据转换* Optional还提供了map可以让我们的对数据进行转换并且转换得到的数据也还是被Optiona包装好的保证了我们的使用安全* 例如我们想获取作家的书籍集合。*/private static void test05() {OptionalAuthor authorOptional getAuthorOptional();OptionalListBook booksOptional authorOptional.map(author - author.getBooks());booksOptional.ifPresent(books - books.stream().forEach(book - System.out.println(book.getName())));} } 函数式接口 只有一个抽象方法的接口我们称之为函数接口。JDK的函数式接口都上了Functionallnterface 注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法都是函数式接口。 只要是函数式接口就可以使用函数式编程方法函数式编程方法的目的就是为了专注于业务而无需花费精力在名称上。 函数式接口示例如下 FunctionalInterface public interface FunctionalInterfaceExample1T {void accept(T t); }FunctionalInterface public interface FunctionalInterfaceExample2R,T {R accept(T t); }最后 上述知识总结来自于b站up主三更草堂高质的课程视频链接如下 【Lambda表达式Stream流-函数式编程-java8函数式编程(Lambda表达式OptionalStream流)从入门到精通-最通俗易懂】
http://www.hkea.cn/news/14516295/

相关文章:

  • 网络安全工程师年薪江西seo推广方案
  • 为什么输入网址打开的却是别的网站贸易网站建设
  • 网站后来功能西安千秋网络科技有限公司怎么样
  • 做网站广告公司网站建设属于技术活吗
  • 网站建设与维护要用到代码吗蛋糕店网站开发策划书
  • 网站和app开发网站建设行情
  • 注册网站授权书怎么写制作链接的app的软件有哪些
  • html5的篮球网站开发中国建设工程项目网
  • 网站建设一般要提供什么内容wordpress数据统计插件
  • 卡密网站建设海西州商城网站建设
  • 做外贸进国外网站网站设计公司 杭州
  • 上饶哪里做网站超级外链吧外链代发
  • 站规划在网站建设中的作用wordpress外链图片备份
  • 织梦做的网站怎么传到网上秦皇岛建设公司
  • 东南亚做网站 什么语言第18讲:商品模型 织梦网站系统 dedecms 教学课件
  • 做婚恋网站沈阳专业做网站开发公司
  • 江门网站建设方案应用公园app在线平台
  • 网站建设基础心得更改wordpress程序站点网址
  • 桂林北站停车场收费标准wordpress国外主题慢
  • 房产网站开发公司青岛网站制作百家号
  • 长沙长沙建设网站WordPress首页怎么打开
  • 做诚信通谁给做网站使用rem布局的网站
  • 学用mvc做网站微网站开发框架
  • 国有企业投资建设项目苏州百度首页优化
  • 搭建网站要不要给域名对方公司介绍模板免费
  • 门户网站营销特点电脑培训班速成班附近
  • 建设银行网站表单清理云南 房地产网站建设
  • 建网站郑州wordpress防止机器人注册
  • 网站后台程序下载电子商务网站建设对毕业设计
  • 大型网站建设机构wordpress lens