Java8之边学边记

Java8之边学边记,第1张

Java8之边学边记

一、lambda表达式

1.lambda表达式采用的是函数式编程的概念:

() -> {}

2.lambda表达式代替的是匿名函数,并且只能用在函数式接口(有且只有一个抽象方法),在Java提供的类库中,函数式接口上都有@FunctionalInterface注解。lambda表达式中的{}就是对函数式接口里抽象方法的实现

//例子1:
//函数式接口:
@FunctionalInterface
public interface Employee{
    public void getSalary(){
        
    }
}

public static void main(String[] agrs) {
//匿名函数
    Employee employee = new Employee(){
        @Override
        public void getSalary(){
            System.out.println("111");
        }
    };
}

public static void main(String[] agrs) {
//lambda表达式代替匿名类
    Employee employee = () -> {System.out.println("111");};
}





//例子2:
@FunctionalInterface
public interface MyFunctionalInterface {
    public void single(String msg);
}
 

public static void testonePar(MyFunctionalInterface myFunctionalInterface){
    myFunctionalInterface.single("msg");
}

@Test
public void testoneParameter(){
    testonePar(x-> System.out.println(x));
}

ps:lambda表达式可以代替匿名类:new FunctionalInterface(){},也可代替 FuntionalInterface functionInterface

3. lambda一些小规则:

//情况1
onlyOneParam -> onlyOneexpression;
 
//情况2
onlyOneParam -> onlyOneStatement;

//情况3
(param1,param2) -> {
                        String param = param1 + param2;
                        return param;
                   }

4.java8提供的常用函数式接口:

 四大函数式接口:

1.函数型接口Function

        提供任意一种类型的参数,返回另外一个任意类型返回值。 R apply(T t);

public class FunctionInterface {
    public static void main(String[] args) {
        
        String result = testFunction("Tim", (name) -> name + "Li");
        System.out.println("result = " + result);
    }

    
    private static String testFunction(String name, Function function) {
        // apply()方法为函数型接口Function的唯一抽象方法
        return function.apply(name);
    }
}

2.消费性接口Consumer

        提供任意一种类型的参数,返回空值。 void accept(T t);

public class FunctionInterface {
    public static void main(String[] args) {
        
       testConsumer(2, x -> System.out.println("传入的数字为:" + x));
    }

    
    private static void testConsumer(int x, Consumer consumer) {
        // accept()方法为消费性接口Consumer的唯一抽象方法
        consumer.accept(x);
    }
}

3. 供给型接口Supplier

参数为空,得到任意一种类型的返回值。T get();

public class FunctionInterface {
    public static void main(String[] args) {
        
       String result = testSupplier(() -> "hello Supplier");
        System.out.println("result = " + result);
    }

    
    private static String testSupplier(Supplier supplier) {
        // get()方法为供给型接口Supplier的唯一抽象方法
        return supplier.get();
    }
}

4. 断言型接口Predicate 

提供任意一种类型的参数,返回boolean返回值。boolean test(T t);

public class FunctionInterface {
    public static void main(String[] args) {
        
       Boolean result = testPredicate("b", str -> str.equals("a"));
        System.out.println("result = " + result);
    }

    
    private static Boolean testPredicate(String str, Predicate predicate) {
        // test()方法为断言型接口Predicate的唯一抽象方法
        return predicate.test(str);
    }
}

二、方法引用

同lambda表达式,方法引用也可替代函数式接口,使代码更整洁。

方法引用主要有如下三种使用情况

     (1). 类::实例方法

e.g. 

String::compareToIgnoreCase 等同于 (x,y)->x.compareToIgnoreCase(y)

     (2). 类::静态方法

     (3). 对象::实例方法

(2)和(3)等同于lambda表达式,e.g.

System.out::println 等同于(x)->System.out.println(x)
Math::pow 等同于(x,y)->Math.pow(x,y).

此外,方法引用还可以使用this::methodName及super::methodName表示该对象或者其父类对象中的方法

还有构造器、自由变量就先不在此赘述了,以后有机会可以看:java8之lambda表达式入门 - 【兰陵笑笑生】 - 博客园

二、 Stream

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5582942.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存