jdk8 Lambda表达式定义 && Stream 介绍

1,什么是Lambda表达式:
Lambda表达式理解:匿名函数的替代,Lambda允许将函数作为一个方法的参数传递。一般有函数式接口的类都可以使用Lambda表达式书写。
2,什么是函数式接口:
只有一个抽象方法的接口,可以有其他普通方法,只能一个抽象方法,一般有注解:@Functioninterface
3,Lambda表达式基本语法:

->(箭头符号),将表达式分为2部分,左边:(参数1,参数2..)表示参数列表,右边:{}内部是方法体
函数式接口 变量名=(参数1,参数2...)->{//方法体}
例子1:

/**
 * @author lyx
 * @create 2020-04-21 21:13
 */
public class Lamdba {
    public static void main(String[] args) {
//        Lambda表达式基本语法:
//        函数式接口 变量名=(参数1,参数2...)->{//方法体}

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

//       Lamdba方式
        new Thread( //run()之前的代码,包含run名称,省略了。把不变的代码去掉,只写逻辑的部分。还有Lambda表达式会自动识别返回值,因此不用担心返回值问题。
//                new Runnable() { @Override public void run() {
                ()->System.out.println(3)
        ).start();

        System.out.println(2);

    }


}

例子2:

//按字符串长度排序
    public static void Example2(){
/*        TreeSet<String> ts=new TreeSet<String>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.length()-o1.length();
            }
        });*/
        TreeSet<String> ts=new TreeSet<String>(
                (o1, o2) -> o2.length()-o1.length()
        );
        ts.add("abc");
        ts.add("a");
        ts.add("abcdefff");
        ts.add("abes");
        System.out.println(ts);//[abcdefff, abes, abc, a]
    }

4,函数式接口是Lambda表达式和方法引用的目标类型。主要分为四大类:
4-1,消费型接口(Comsumer)特点:有参数无返回值
4-2,供给型接口(Supplier)特点:无参数有返回值
4-3,判断型接口(Predicate)特点:返回boolean
4-4,功能型接口(Function)特点:有参数有返回值


java.util.funtion包
不提供无参数无返回值。

 

Stream流

1,

Stream特点:
Stream自己不会存储元素
Stream不会改变源对象,相反他们会返回一个持有结果的新Stream
Stream操作是延迟执行的,意味着他们会等到需要结果的时候才执行。

 

2, 

 使用Stream对象三步走:
    1,创建Stream
    2,使用Stream处理,只处理,不存储元素,不会改变源对象
    3,终结结果,输出。

 

中间操作:特点,基本都返回Stream类型
filter()
distinct()
limit()
skip()
peek()
sorted()
map()
flatMap()


终结操作:特点:基本不会再返回Stream类型
forEach()
count()
max()
min()
allMatch()
anyMatch()
noneMatch()
collection()

更多方法查看文档:
中文:https://www.matools.com/api/java8
英文:https://docs.oracle.com/javase/8/docs/api/index.html

 

 

例1

/*    allMatch(IntPredicate predicate)  //IntPredicate判断型接口,boolean类型
    返回此流的所有元素是否与提供的谓词匹配。
anyMatch(IntPredicate predicate)
    返回此流的任何元素是否与提供的谓词匹配。
noneMatch(IntPredicate predicate)
    返回此流的元素是否与提供的谓词匹配。*/

    public static void a(){
        List<User> list=new ArrayList<User>();
        list.add(new User(10,"zs"));
        list.add(new User(13,"lx"));
        list.add(new User(15,"ww"));
        list.add(new User(15,"ww"));

        Stream<User> stream = list.stream();
//        boolean b = stream.allMatch(t -> 10 == t.getAge() && "zs".equals(t.getName()));
//        System.out.println(b);//false
//        boolean b1 = stream.anyMatch(t -> 10 == t.getAge() && "zs".equals(t.getName()));
//        System.out.println(b1);//true

        boolean b2= stream.noneMatch(t -> 10 == t.getAge() && "zs".equals(t.getName()));
        System.out.println(b2);//false


    }

例2

/*    long	count()
    返回此流中的元素数。

    static IntStream	of(int t)
    返回一个包含单个元素的顺序 IntStream 。即创建流

    java.util.stream.IntStream skip(long n)
    在丢弃流的第一个 n元素后,返回由该流的 n元素组成的流。*/
   public static void a(){
        Stream<Integer> stream = Stream.of(1, 22, 41, 5, 73, 9);
        stream = stream.skip(2);//跳过第二个数,22
        stream.forEach(System.out::print);//41 5 73 9

//          long count = stream.count();
//            System.out.println(count);//6
    }

例 3

/*    IntStream distinct()//去重,依赖equal(),需要重写该方法才会生效,
    有参数无返回值
    返回由该流的不同元素组成的流。*/
    public static void a(){

        List<User> list=new ArrayList<User>();
        list.add(new User(10,"zs"));
        list.add(new User(13,"lx"));
        list.add(new User(15,"ww"));
        list.add(new User(15,"ww"));

        Stream<User> stream = list.stream();
        stream.distinct().forEach((t)->{
            System.out.print(t.getName());//zslxww
        });

    }

 例4

/*    Stream<T> filter(Predicate<? super T> predicate)//boolean类型
    返回由与此给定谓词匹配的此流的元素组成的流。*/

    public static void a(){

        List<User> list=new ArrayList<User>();
        list.add(new User(10,"zs"));
        list.add(new User(13,"lx"));
        list.add(new User(15,"ww"));

        Stream<User> stream = list.stream();
        stream.filter(t-> !"zs".equals(t.getName()))
                .forEach(t->System.out.print(t.getName()));//lxww

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值