JDK8

本贴最后更新于 2314 天前,其中的信息可能已经沧海桑田

1 函数式接口

1.1 定义

  • 函数式接口是只包含一个抽象方法声明的接口,如 java.lang.Runnable

1.2 声明方式

  • @FunctionalInterface

1.3 案例

@FunctionalInterface
public interface WorkerInterface {
	public void dosomething();
}


public class WorkInterfaceTest {
	public static void excute(WorkerInterface workerInterface) {
		workerInterface.dosomething();
	}

	public static void main(String[] args) {
		// 运用同名类实现
		excute(new WorkerInterface() {

			@Override
			public void dosomething() {
				System.out.println("hello world");
			}
		});

		// 用lambda表达式实现
		excute(() -> System.out.println("hello world"));
	}
}

运行结果:

hello world
hello world

2 Lambda 表达式和函数式接口

2.1 定义

  • 为匿名函数,是没有声明的方法,即无访问修饰符、返回值和名称

2.2 语法

  • (arg1, arg2...) -> { body }
  • (type1 arg1, type2 arg2...) -> { body }

2.3 结构

  • 一个 Lambda 表达式可以有 0 个或多个参数;
  • 参数类型可明确声明,或根据上下文推断。如(int a)与(a)效果相同;
  • 所有参数需在()内,参数之间用逗号隔开。如(a,b)或(int a, int b);
  • 空圆括号代表参数为空;当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a;
  • Lambda 表达式的主体可包含零条或多条语句
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空

2.4 案例

2.4.1 实现 Runnable 接口
public class RunnableLambda {
	public static void main(String[] args) {
		// 1.1使用匿名内部类
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("hello world1");
			}
		}).start();
		
		// 1.2使用匿名内部类
		Runnable r1 = new Runnable() {
			
			@Override
			public void run() {
				System.out.println("hello world2");
			}
		};
		
		r1.run();
		
		// 2.1 lambda表达式
		new Thread(() -> System.out.println("hello world3")).start();;
		
		// 2.2 lambda表达式
		Runnable r2 = ()-> System.out.println("hello world4");
		r2.run();
	}
}

结果

hello world1
hello world2
hello world3
hello world4
2.4.2 排序数组
  • 匿名内部类的排序

    public class ArraySortLambda {
    public static void main(String[] args) {
    String[] players = { "Jack", "Tom", "John", "Andy", "Role"};

    	// 1.1 使用匿名内部类根据 name 排序 players
    	Arrays.sort(players, new Comparator() {
    		@Override
    		public int compare(String s1, String s2) {
    			return (s1.compareTo(s2));
    		}
    	});
    
    	// java8新特性
    	Arrays.asList(players).stream().forEach(System.out::println);
    
    
    }
    

    }

结果

Andy
Jack
John
Role
Tom
  • lambda 表达式的排序

    import java.util.Arrays;
    import java.util.Comparator;

    public class ArraySortLambda {
    public static void main(String[] args) {
    String[] players = { "Jack", "Tom", "John", "Andy", "Role"};
    // 排序 1
    Comparator sortByName = (String s1, String s2) -> (s1.compareTo(s2));
    Arrays.sort(players, sortByName);
    // 或者排序二
    Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));

    	Arrays.asList(players).stream().forEach(System.out::println);
    
    }
    

    }

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...