java8 学习记录

一。  lambda表达式

参考 https://www.cnblogs.com/franson-2016/p/5593080.html

package com.mytest.java8;

import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * @author zhangc
 * @since 2019/1/25 10:39
 * java 双冒号
 * 用法: 遍历, 匿名内部类
 * java stream
 *      filter 可以过滤内容
 *      limit 可以限制条数
 *      sort 可以帮助排序
 *      min,max 最大最小,类似比较
 *      map 可以指定处理如String转int ,或者指定要用的字段如Person::age
 *      collect 收集信息,如把一个list 用逗号关联
 *      summaryStatistics 可以统计一组数字:最大最小平均总和等
 **/
public class Colon {
    public static void main(String[] args) {
        List<String> a1 = Arrays.asList("a","b","c","d");
        a1.forEach(x -> printValur(x));


        Consumer<String> consumer = Colon::printValur;
        a1.forEach(x -> consumer.accept(x));

        a1.forEach(System.out::println);


        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("run");
            }
        }).start();

        new Thread(()->{
            System.out.println("run");
            System.out.println("run1");
        }).start(); // ()-> 相当于new+方法参数 和 方法实现


        String[] pl = new String[]{"fds","fds","121","1211111","1233","dkk"};
        //Arrays.sort(pl,(String x,String x1)->(x.compareTo(x1)));
        //Arrays.asList(pl).forEach(x-> System.out.println(x));
        Arrays.sort(pl,Comparable::compareTo);
        Arrays.asList(pl).forEach(x-> System.out.println("张"+x));
        Predicate<String> p1 = (p)->p.length()<5;
        Arrays.asList(pl).stream().filter(p1).limit(3).forEach(x-> System.out.println("filter"+x));

        String[] p2 = new String[]{"fds","fds","121","1211111","1233","dkk"};
        Arrays.asList(p2).stream().sorted(Comparable::compareTo).forEach(x->System.out.println("so"+x));
        String dou = Arrays.asList(p2).stream().sorted(Comparable::compareTo).map(String::toString).collect(Collectors.joining(","));
        System.out.println(dou);

        List<Integer> sta = Arrays.asList(1,2,3,4,5);
        IntSummaryStatistics ins = sta.stream().mapToInt((x)->x).summaryStatistics();
        System.out.println(ins.getAverage() + ":" + ins.getCount() +":" + ins.getSum()+":"+ins.getMax());

    }

    public static void printValur(String str) {
        System.out.println("print value : " + str);
    }
}

二: 接口新加 默认方法和静态方法 

  

public interface IterA{
  
  /**
  * 好好的接口为什么要加个默认方法呢(你是不是也有这个疑问,网上只说java8新增了哪些功能不说为什么的,送个呵呵给他们)?
  * 网上查了下: 1. 如果我有很多类实现了这个接口,那么我想往这个接口加个方法,岂不是所有实现类都要改一下,想想就不美好啊。(可是我有个疑问,接口不就是这个功能吗:抽象定义,实现类必须实现。)
  * 2. 写一些默认方法,实现类就可以直接用或者选择复写。 so, 这不是继承吗?表示要疯了
  * 忽然看到网上说实现接口A 和接口B ,如果A 和 B 有同样的方法,则实现类需要复写该方法。 那如果有不同的方法呢,那是不是说A B 的默认方法都可以被实现类使用。原来如此:这是多继承啊。。
  * 整了半天 这是java 通过接口的方式 变相的支持了多继承(但是注意静态方法是不会被继承的,还是老老实实用接口.静态方法调用)。
  */

default void aa(){ } static void sm(){ System.out.println("12"); } }

 3. 双冒号方法引用

  如 ClassA::new    含义就是 new ClassA()

    ClassA::methodA  含义是 调用 ClassA.mothedA()   如何mothedA 不是静态方法,那就是调用实例的方法

    classA:methodA   就是调用 calssA.methodA();

  注意这种方式 只能是在 支持lambda 的地方使用。如 forEach(  这里使用)。

4. 元空间: 替代永久代,不在虚拟机中。  

原文地址:https://www.cnblogs.com/zhangchenglzhao/p/10318807.html