2022-06-23 一些java8

流处理
流是一系列数据项,一次只生成一项。程序可以从输
入流中一个一个读取数据项,然后以同样的方式将数据项写入输出流。一个程序的输出流很可能
是另一个程序的输入流
::语法(即“把这个方法作为值”)将其传给方法


image.png

image.png
image.png

何时使用findFirst和findAny
你可能会想,为什么会同时有findFirst和findAny呢?答案是并行。找到第一个元素
在并行上限制更多。如果你不关心返回的元素是哪个,请使用findAny,因为它在使用并行流
时限制较少。
无限流输出100个斐波那契数列

 Stream
.iterate(new BigInteger[]{BigInteger.ZERO, BigInteger.ONE}, (t) -> new BigInteger[]{t[1], t[0].add(t[1])})
.limit(100)
.forEach(ints -> {
            System.out.println(ints[0]);
        });

分区是分组的特殊情况:由一个谓词(返回一个布尔值的函数)作为分类函数,它称分区函


image.png

image.png

example: 寻找质数表

 public static void main(String[] args) {

        Map> booleanListMap = partitionPrimesWithCollector(2);
        booleanListMap.get(true).forEach(System.out::println);
    }
public static Map> partitionPrimesWithCollector(int n) {
        return IntStream.rangeClosed(2, n).boxed().collect(new PrimeNumbersCollector());
    }
public static boolean isPrime(List primes, int candidate) {
        return primes.stream().noneMatch(integer -> candidate % integer == 0);
    }
public static class PrimeNumbersCollector implements Collector>, Map>> {

        @Override
        public Supplier>> supplier() {
            return () -> new HashMap>() {{
                put(true, new ArrayList());
                put(false, new ArrayList());
            }};
        }

        @Override
        public BiConsumer>, Integer> accumulator() {
            return (Map> acc, Integer candidate) -> {
                acc.get(isPrime(acc.get(true), candidate)).add(candidate);
            };
        }

        @Override
        public BinaryOperator>> combiner() {
            return (Map> map1, Map> map2) -> {
                map1.get(true).addAll(map2.get(true));
                map1.get(false).addAll(map2.get(false));
                return map1;
            };
        }

        @Override
        public Function>, Map>> finisher() {
            return Function.identity();
        }

        @Override
        public Set characteristics() {
            return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH));
        }
    }

parallel 并行流
sequential 串行流
forkjoin workstealing 算法
Spliterator 自定义拆分

(1) 类中的方法优先级最高。类或父类中声明的方法的优先级高于任何声明为默认方法的优
先级。
(2) 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择
拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体。
(3) 最后,如果还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法

image.png

image.png

image.png

科里化的理论定义
科里化是一种将具备2个参数(比如,x和y)的函数f转化为使用一个参数的函数g,并
且这个函数的返回值也是一个函数,它会作为新函数的一个参数。后者的返回值和初始函数的
返回值相同,即f(x,y) = (g(x))(y)。
当然,我们可以由此推出:你可以将一个使用了6个参数的函数科里化成一个接受第2、4、
6号参数,并返回一个接受5号参数的函数,这个函数又返回一个接受剩下的第1号和第3号参数
的函数。
一个函数使用所有参数仅有部分被传递时,通常我们说这个函数是部分应用的(partially
applied)
基本类型:
int, long, shore, byte, bool, float, double
算数:


image.png

string:


image.png

循环:
fori
while
do while
数组:
int[] ints = new int[];
面向对象
泛型
反射
集合
list set map queue
stream
注解

日期
国际化
locale

你可能感兴趣的:(2022-06-23 一些java8)