java8
java8
weixin_42868638
这个作者很懒,什么都没留下…
展开
-
函数式思考
1.编程范式命令式编程命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。比如:如果你想在一个数字集合 collection(变量名) 中筛选大于 5 的数字,你需要这样告诉计算机: (1) 创建一个存储结果的集合变量 results; (2) 遍历这个数字集合 collection; (3) 一个一个地判原创 2020-12-07 11:06:41 · 118 阅读 · 0 评论 -
新的日期和时间API
1.旧的时间和日期的API的缺陷Java 的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,而且都不是线程安全的。Date如果不格式化,打印出的日期可读性差。Thu Sep 12 13:47:34 CST 2019可以使用 SimpleDateFormat 对时间进行格式化,但 SimpleDateFormat 是线程不安全的(1) format 是线程不安全//SimpleDateFormat的format方法源码如下:privat原创 2020-12-04 11:37:00 · 218 阅读 · 0 评论 -
CompletableFuture异步编程
1.同步API与异步API同步API其实只是对传统方法调用的另一种称呼:你调用了某个方法,调用方在被调用方运行的过程中会等待,被调用方运行结束返回,调用方取得被调用方的返回值并继续运行。即使调用方和被调用方在同的线程中运行,调用方还是需要等待被调用方结束运行,这就是阻塞式调用这个名词的由来。与此相反,异步API会直接返回,或者至少在被调用方计算完成之前,将它剩余的计算任务交给另一个线程去做,该线程和调用方是异步的——这就是非阻塞式调用的由来。执行剩余计算任务的线程会将它的计算结果返回给调用方。返回的方原创 2020-12-04 10:10:56 · 345 阅读 · 1 评论 -
默认方法
1. 为什么要用默认方法默认方法的主要目标用户是类库的设计者,如List接口增加了stream方法,在没有默认方法之前,像guava和apache这样对List接口封装的库,不得不要实现stream方法。而有了默认方法,就不用了。2.抽象类和抽象接口的区别它们不都能包含抽象方法和包含方法体的实现吗?一个类只能继承一个抽象类,但是一个类可以实现多个接口一个抽象类可以通过实例变量(字段)保存一个通用状态,而接口是不能有实例变量的3.解决冲突的规则如果一个类使用相同的函数签名从多个地方(比如另原创 2020-12-02 16:40:35 · 429 阅读 · 0 评论 -
测试与调试
1.测试1.1 测试可见 Lambda 函数的行为可以借助某个字段访问Lambda函数,这种情况,你可以利用这些字段,通过它们对封装在Lambda函数内的逻辑进行测试。//比如,我们假设你在Point类中添加了静态字段compareByXAndThenYpublic class Point{ public final static Comparator<Point> compareByXAndThenY = comparing(Point::getX).thenComparin原创 2020-12-02 13:36:20 · 185 阅读 · 0 评论 -
使用 Lambda 重构面向对象的设计模式
1. 策略模式策略模式代表了解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案。(比如苹果的重量,或者颜色)来筛选库存中的苹果。策略模式包含三部分内容:一个代表某个算法的接口(它是策略模式的接口)。一个或多个该接口的具体实现,它们代表了算法的多种实现(比如,实体类ConcreteStrategyA或者ConcreteStrategyB)。一个或多个使用策略对象的客户。//我们假设你希望验证输入的内容是否根据标准进行了恰当的格式化(比如只包含小写字母或数字)。//你可以从定义一个原创 2020-12-02 10:30:26 · 187 阅读 · 0 评论 -
如何使用Lambda表达式重构代码
1.从匿名类到 Lambda 表达式的转换是将实现单一抽象方法的匿名类转换为Lambda表达式。Runnable r1 = new Runnable(){ public void run(){ System.out.println("Hello"); } }; Runnable r2 = () -> System.out.println("Hello");但是某些情况下,将匿名类转换为Lambda表达式可能是一个比较复杂的过程:匿名类和Lambda表达式中的this和su原创 2020-12-02 09:27:29 · 290 阅读 · 0 评论 -
并行处理与性能
1.Java 7之前并行处理数据在Java 7之前,并行处理数据集合非常麻烦:你得明确地把包含数据的数据结构分成若干子部分你要给每个子部分分配一个独立的线程你需要在恰当的时候对它们进行同步来避免不希望出现的竞争条件,等待所有线程完成最后把这些部分结果合并起2.并行流Stream接口可以让你非常方便地处理它的元素,可以通过对收集源调用parallelStream或parallel方法来把集合转换为并行流。并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流。这样一来,你就原创 2020-12-01 14:12:11 · 209 阅读 · 0 评论 -
Optional
NullPointerException相信每个JAVA程序员都不陌生,是JAVA应用程序中最常见的异常。之前,Google Guava项目曾提出用Optional类来包装对象从而解决NullPointerException。受此影响,JDK8的类中也引入了Optional类,在新版的SpringData Jpa和Spring Redis Data中都已实现了对该方法的支持。1.emptystatic <T> Optional<T> empty()//返回空的 Optional原创 2020-11-27 14:38:10 · 137 阅读 · 0 评论 -
NumericStream
NumericStream 的好处是可以节省比较多的内存开销,数据量大的话是比较明显的,因为int 4个字节的数字比Integer类型的小很多。1.将Stream转化为IntStream//把大于3的和打印出来 Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5}); Integer result = stream.filter(i -> i.intValue() > 3).reduce(0,原创 2020-11-27 11:41:03 · 85 阅读 · 0 评论 -
中间操作2之takeWhile、dropWhile、iterate、ofNullable (java9)
1.takeWhile从Stream中依次获取满足条件的元素,直到不满足条件为止结束获取 /** * 举例:Stream中的元素 12, 4, 3, 6, 8, 9 * * 条件是 x -> x % 2 == 0 ,即判断是否为偶数,即当遇到元素不为偶数时终止获取 * * 那么得到的结果输出就是,12, 4 因为下一个元素为3不为偶数,即结束获取,丢弃后面的其他元素 */IntStream.of(12, 4, 3, 6, 8, 9).takeWhile(x -> x % 2原创 2020-11-27 11:00:42 · 207 阅读 · 0 评论 -
中间操作2之filter、distinct、limit、skip、sorted
1.filter```javaCollection<Person> collection = new ArrayList();collection.add(new Person("张三", 22, "男"));collection.add(new Person("李四", 19, "女"));collection.add(new Person("王五", 34, "男"));collection.add(new Person("赵六", 30, "男"));collection.a原创 2020-11-27 10:50:34 · 201 阅读 · 0 评论 -
BinaryOperator函数式接口
1.BinaryOperator的定义@FunctionalInterfacepublic interface BinaryOperator<T> extends BiFunction<T, T, T> { static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) { Objects.requireNonNull(comparator);原创 2020-11-26 10:59:45 · 703 阅读 · 0 评论 -
比较器总结
我在学习java8过程中,看到了对象比较使用了多种方式,感觉有必要总结一下。1. comparator接口与Comparable接口的区别有的文章这样解释二者的区别,Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。现在通过一个例子,就能明白什么是内部比较器,外部比较器了。//Comparable 定义在 Person类的内部:public class Persion implements Comparable { @Override public in原创 2020-11-26 10:33:19 · 218 阅读 · 0 评论 -
中间操作1之map、flatMap、peek
流中间操作在应用到流上,返回一个新的流。下面列出了常用的流中间操作:map:通过一个 Function 把一个元素类型为 T 的流转换成元素类型为 R 的流。flatMap:通过一个 Function 把一个元素类型为 T 的流中的每个元素转换成一个元素类型为 R 的流,再把这些转换之后的流合并。filter:过滤流中的元素,只保留满足由 Predicate 所指定的条件的元素。distinct:使用 equals 方法来删除流中的重复元素。limit:截断流使其最多只包含指定数量的元素。ski原创 2020-11-25 14:20:32 · 556 阅读 · 0 评论 -
终结操作之forEach、forEachOrdered 、reduce、collect
3.终结操作终结操作遍历流来产生一个结果或是副作用。在一个流上执行终结操作之后,该流被消费,无法再次被消费forEach 和 forEachOrdered 对流中的每个元素执行由 Consumer 给定的实现。在使用 forEach时,并没有确定的处理元素的顺序;forEachOrdered 则按照流的相遇顺序来处理元素,如果流有确定的相遇顺序的话reduce进行递归计算collect生成新的数据结构3.1 forEach 和 forEachOrdered//在这里forEach执行是顺序原创 2020-11-25 10:09:23 · 1406 阅读 · 0 评论 -
创建Stream
下面我们通过代码了解常见创建Stream的几种方式吧。public class CreateStream { public static void main(String[] args) { createStreamFromCollection().forEach(System.out::println); } //1.通过Collection private static Stream<String> createStreamFromColl原创 2020-11-24 10:25:18 · 275 阅读 · 0 评论 -
进一步了解Stream
前面我们已对Stream有个初步的了解,现在在深入了解下吧。一、概述Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。特点:不是数据结构,不会保存数据。不会修改原来的数据源,它会将操作后的数据保存到另外一原创 2020-11-24 09:44:55 · 344 阅读 · 0 评论 -
Stream体验
有个菜谱menu,记录了菜的名称,能量,是否是素菜,类型。public class Dish { private final String name; private final boolean vegetarian; private final int calories; private final Type type; public Dish(String name, boolean vegetarian, int calories, Type type)原创 2020-11-23 17:06:18 · 79 阅读 · 0 评论 -
Lambda表达式方法推导
Consumer<String> consumer = s -> System.out.println( s); myConsumer(consumer, "XiaoMing"); myConsumer(s -> System.out.println(s), "XiaoMing"); myConsumer(System.out::println, "XiaoMing"); List<Apple> apples = Arrays.a..原创 2020-11-19 11:24:05 · 223 阅读 · 0 评论 -
Lambda表达式深入解析
1.Lambda介绍lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)匿名的,有输入输出,但没有函数名Function简洁的2.Lambda表达式的语法2.1 基本语法(parameters) -> expression或(parameters) ->{ statements;}2.2 简单例子//1.接受参数,并有返回值Comparator原创 2020-11-18 14:46:47 · 300 阅读 · 0 评论 -
让参数具有形为能力
一开始需求比较简单,查询苹果颜色为"green"public class FilterApple { public static List<Apple> findGreenApple(List<Apple> apples){ List<Apple> greenApples = new ArrayList<>(); for (Apple apple: apples){ if ("green"..原创 2020-11-17 16:58:09 · 91 阅读 · 3 评论