首页 > 其他 > 详细

JUC与函数

时间:2021-04-03 09:54:06      阅读:28      评论:0      收藏:0      [点我收藏+]

四大函数式接口

lambda表达式、链式编程、函数式接口、Stream流式计算

函数式接口:只有一个方法的接口

lambda表达式、链式编程、函数式接口、Stream流式计算@FunctionalInterface
public interface Runnable {
public abstract void run();
}
//泛型、枚举、反射1.5
//lambda表达式、链式编程、函数式接口、Stream流式计算
//超级多FunctionalInterface
//简化编程模型,在新版的框架底层大量应用!
//foreach(消费者类型的函数式接口)

/**
* Function 函数式接口,有一个输入参数,有一个输出
* 只要是 函数式接口 就可以用 lambda 表达式简化
*/
public class Demo01 {
public static void main(String[] args) {
// Function<String, String> function = new Function<String, String>() {
// @Override
// public String apply(String str) {
// return str;
// }
// };
Function function =(str)->{return str;};
System.out.println(function.apply("asd"));
}
}
/**
* 断定型接口:有一个输入参数,返回值只能是 布尔值!
*/
public class Demo02 {
public static void main(String[] args) {
//判断字符串是否为空
// Predicate<String> predicate = new Predicate<String>() {
// @Override
// public boolean test(String str) {
// return str.isEmpty();
// }
// };
Predicate<String> predicate = (str)->{return str.isEmpty();};
System.out.println(predicate.test(""));
}
}
/**
* Consumer 消费型接口:只有输入,没有返回值
*/
public class Demo03 {
public static void main(String[] args) {
// Consumer<String> consumer = new Consumer<String>() {
// @Override
// public void accept(String str) {
// System.out.println(str);
// }
// };
Consumer<String> consumer = (str)->{System.out.println(str);};
consumer.accept("sdadasd");
}
}
/**
* Supplier 供给型接口:没有参数,只有返回值
*/
public class Demo04 {
public static void main(String[] args) {
// Supplier<Integer> supplier = new Supplier<Integer>() {
// @Override
// public Integer get() {
// System.out.println(" get()");
// return 1024;
// }
// };
Supplier<Integer> supplier = ()->{return 1024;};
System.out.println(supplier.get());
}
}

Stream流式计算

什么是Stream流式计算    大数据:存储 + 计算    集合、MySQL 本质就是存储东西的     计算都应该交给流来操作!

/**
* 题目要求:一分钟内完成此题,只能用一行代码实现!
* 现在有五个用户!筛选:
* 1、ID 必须是偶数
* 2、年龄必须大于23
* 3、用户名转为大写字母
* 4、用户字母倒着排序
* 5、只能输出一个用户
*/
public class Test {
public static void main(String[] args) {
User u1 = new User(1,"a",21);
User u2 = new User(2,"b",22);
User u3 = new User(3,"c",23);
User u4 = new User(4,"d",24);
User u5 = new User(6,"e",25);
//集合就是存储
List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
//计算交给Stream
//lambda表达式、链式编程、函数式接口、Stream流式计算
list.stream()
.filter(u->{return u.getId()%2==0;})
.filter(u->{return u.getAge()>23;})
.map(u->{return u.getName().toUpperCase();})
.sorted((uu1,uu2)->{return uu2.compareTo(uu1);})
.limit(1)
.forEach(System.out::println);
}
}

ForkJoin

什么是 ForKJoin

ForKJoin 在JDK 1.7,并行执行任务!提高效率,大数据量!

大数据:Map Reduce(把大任务拆分为小任务)

ForKJoin特点:工作窃取          这个里面维护的都是双端队列

RecursiveAction  递归事件没有返回值, RecursiveTask   递归事件有返回值

/**
* 求和计算的任务!
* //如何使用ForkJoin
* //1、ForkJoinPool
* //2、计算任务 forkJoinPool.execute(ForkJoinTask task)
* //3、计算类要继承 ForkJoinTask
*/
public class ForkJoinDemo extends RecursiveTask<Long> {
private Long start;//1
private Long end;//1990900000
//临界值
private Long temp = 10000L;

public ForkJoinDemo(Long start, Long end) {
this.start = start;
this.end = end;
}
//计算方法
@Override
protected Long compute() {
if((end-start)<temp){
Long sum = 0L;
for (Long i = start; i <= end; i++) {
sum+= i;
}
return sum;
}else {//forkJoin
long middle = (start+end)/2;//中间值
ForkJoinDemo task1 = new ForkJoinDemo(start, middle);
task1.fork();//拆分任务,把任务压入线程队列
ForkJoinDemo task2 = new ForkJoinDemo(middle+1, end);
task2.fork();//拆分任务,把任务压入线程队列
return task1.join()+task2.join();
}
}
}
/**
* 同一个任务,别人效率高你几十倍!
*/
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//test1();//5809
//test2();//6771
test3();//120
}
//普通程序员
public static void test1(){
Long sum = 0L;
long start = System.currentTimeMillis();
for (Long i = 1L; i <= 10_0000_0000; i++) {
sum+= i;
}
long end = System.currentTimeMillis();
System.out.println("sum=" +sum+ "时间" + (end - start));
}
//会使用ForkJoin
public static void test2() throws ExecutionException, InterruptedException {
long start = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Long> task = new ForkJoinDemo(0L, 10_0000_0000L);
// forkJoinPool.execute(task);//执行任务 没有结果
ForkJoinTask<Long> submit = forkJoinPool.submit(task);//提交任务
Long sum = submit.get();
long end = System.currentTimeMillis();
System.out.println("sum=" +sum+ "时间" + (end - start));
}
public static void test3(){
long start = System.currentTimeMillis();
//Stream并行流
long sum = LongStream.rangeClosed(0L, 10_0000_0000).parallel().reduce(0, Long::sum);
long end = System.currentTimeMillis();
System.out.println("sum=" +sum+ "时间" + (end - start));
}
}

异步回调

Future 设计的初衷:对将来的某个事件的结果进行建模

/**
* 异步调用: CompletableFuture
* //异步执行
* //成功回调
* //失败回调
*/
public class Demo01 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//发起一个请求,没有返回值的 runAsync 异步回调
// CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(()->{
// try {
// TimeUnit.SECONDS.sleep(2);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "runAsync=>Void");
// });
// System.out.println("1111");
// completableFuture.get();//获取执行结果
//有返回值的 supplyAsync 异步回调
//ajax,成功和失败的回调
//返回的是错误信息
CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName()+"supplyAsync=>Integer");
int i = 10/0;
return 1024;
});
completableFuture.whenComplete((t,u)->{
System.out.println("t=>" + t);//正常的返回结果
System.out.println("u=>" + u);//错误信息:java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
}).exceptionally((e)->{
System.out.println(e.getMessage());
return 112;//可以获得错误的返回结果
}).get();
}
}

JUC与函数

原文:https://www.cnblogs.com/linhtx212318293/p/14598590.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!