并行和并发是个非常大的概念,也不是一篇文章能够完全的包含,所以这边只能简要概括如何通过Lambda表达式来实现。
首先并行和并发是两个不同的概念:
并行英文叫Parallelism,理想情况下,每个线程拥有自己独立的cpu核心,像平行线一样的各自执行自己的任务,多用于CPU密集型的任务;
并发英文叫Concurrency,每个线程不一定拥有独立的cpu核心,每次的执行时间点和执行时间长度由系统调度决定,多用于处理io阻塞型的任务。
不恰当的并行或并发编程会降低系统的处理效率。
Lambda实现并行编程很容易:
1. 集合可以通过parallelStream()方法获取拥有并行处理能力的Stream;
2. Stream可以通过parallel()方法标记你希望以并行的方式处理。
double sum = IntStream.range(1, 1000000) .asDoubleStream() .parallel() .map(x -> Math.sin(x) * Math.sin(x) + Math.cos(x) * Math.cos(x)) .sum();
并行处理的Stream会自行处理锁的问题,所以不要在没有把握的时候自行加锁,尤其要注意有些方法自带synchronized,并行的效果反而没有顺序执行(sequential)好。
refer Java 8 Stream parallel performance and CPU resource consumption seems really poor compared to serial
关于并发,可以参阅最近比较火的响应式编程
这边简要的写个示例:根据iteye用户的rss,来输出博客的标题和链接
class Item { public String title; public String link; }
解析rss
static List<Item> retrieveTitleNLink() { List<Item> list = new LinkedList<>(); try { URL url = new URL("http://xuanzhui.iteye.com/rss"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.addRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"); BufferedInputStream inputStream = new BufferedInputStream(connection.getInputStream()); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = factory.newDocumentBuilder(); Document document = documentBuilder.parse(inputStream); NodeList itemList = document.getDocumentElement().getElementsByTagName("item"); for (int i = 0; i < itemList.getLength(); i++) { Node node = itemList.item(i); NodeList itemChildren = node.getChildNodes(); Item item = new Item(); for (int j = 0; j < itemChildren.getLength(); j++) { Node child = itemChildren.item(j); if (child.getNodeName().equalsIgnoreCase("title")) item.title = child.getTextContent(); if (child.getNodeName().equalsIgnoreCase("link")) item.link = child.getTextContent(); } list.add(item); } } catch (IOException | ParserConfigurationException | SAXException e) { e.printStackTrace(); } return list; }
接下来是比较核心的代码,先看一下直接用匿名类的写法
public static void main(String[] args) throws IOException { Observable.create(new Observable.OnSubscribe<Item>() { @Override public void call(Subscriber<? super Item> subscriber) { // 要做的就是不断向注册者发送数据 List<Item> list = retrieveTitleNLink(); for (int i = 0; i < list.size(); i++) subscriber.onNext(list.get(i)); } }).subscribeOn(Schedulers.io()).subscribe(new Action1<Item>() { @Override public void call(Item item) { // 要做的就是不断处理上面发送的数据 System.out.println("title: " + item.title); System.out.println("link: " + item.link); System.out.println("*********************"); } }); System.out.println("should print immediately without being blocked ☺"); // 这边只是为了主进程等待io进程结束 System.in.read(); }
要重点关注subscribeOn(Schedulers.io()),表示新开一个io的进程处理网络请求。
然后再看Lambda表达式的写法
public static void main(String[] args) throws IOException { Observable .create(subscriber -> retrieveTitleNLink().forEach(subscriber::onNext)) .subscribeOn(Schedulers.io()) .map(item -> { Item tmp = (Item) item; return tmp.title + " ====>>> " + tmp.link; }) .subscribe(System.out::println); System.out.println("should print immediately without being blocked ☺"); // 这边只是为了主进程等待io进程结束 System.in.read(); }
更详细的用法还得看相关文档。
相关推荐
例如,一个接受两个整数并返回它们之和的Lambda表达式可以写作`(int a, int b) -> a + b`。 3. **函数式接口** Lambda表达式与函数式接口紧密相关。函数式接口是指只有一个抽象方法的接口。Java8提供了许多内置的...
Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这个“java8lambda表达式Demo”中,我们将探讨Lambda表达式在Android Studio工程中的实际应用。 ...
例如,一个简单的Lambda表达式 `(int a, int b) -> a + b` 表示了一个接受两个整数参数并返回它们之和的匿名函数。 2. **函数接口** Lambda表达式必须与函数接口(只有一个抽象方法的接口)关联。例如,`Runnable`...
总的来说,Java Lambda表达式与相关的类库更新,如Stream API和日期时间API,共同提升了Java的编程效率和代码可读性,使得开发者能够以更简洁的方式处理复杂任务,尤其在处理大量数据和并发场景下。理解并熟练运用...
- 当Lambda体中的代码完全匹配某个已有的方法时,我们可以直接引用该方法,代替Lambda表达式。 ```java Collections.sort(names, String::compareToIgnoreCase); ``` 6. **变量捕获** - Lambda 表达式可以访问...
例如,`(int x, int y) -> x + y`表示一个接受两个整数参数并返回它们之和的函数。 2. **函数式接口**:Lambda表达式与函数式接口紧密相关,后者只有一个抽象方法。Java标准库提供了许多内置的函数式接口,如`...
Lambda表达式是Java编程语言中的一个关键特性,自Java 8开始引入,它极大地简化了函数式编程,尤其是在处理集合和并发操作时。Lambda表达式的主要目标是使代码更加简洁、易读,同时提高程序的可维护性。下面将对...
综上所述,精通lambda表达式和Java多核编程需要深入理解Java 8及之后版本中引入的新特性,掌握流API的使用,合理选择和使用并行流,并且能够应用并发工具包来处理多线程编程中的问题。同时,还需要具备对Java内存...
在这个"Java8集合 CompletableFuture lambda表达式 新的TimeAPI 和ForkJoin Demo包"中,我们可以深入探讨以下几个关键知识点: 1. **Lambda表达式**: Lambda表达式是Java 8的一大亮点,它简化了对匿名函数的处理...
- **并发编程**:如利用 `Stream API` 进行高效的数据处理和并行计算。 #### 代码示例 接下来,我们通过几个具体的代码示例来进一步加深对 Lambda 表达式应用的理解。 ##### 示例 1:使用 Lambda 表达式进行集合...
Java 8 引入的 Stream API 与 Lambda 表达式结合,提供了链式操作和并行处理的能力。例如,查找名字长度大于5的人: ```java List<Person> longNamedPeople = people.stream() .filter(p -> p.getName().length() ...
总的来说,Lambda表达式和Stream API是Java 8的重要改进,它们提升了代码的简洁性和可读性,同时也引入了函数式编程的概念,使得Java开发者能够更好地应对复杂的数据处理和并发任务。通过熟练掌握这些新特性,开发者...
8. 并行流与Lambda:Lambda表达式也可以用于并行流处理,从而利用多核处理器提高性能。通过调用`stream().parallel()`,我们可以将顺序流转换为并行流。 9. 使用Lambda进行事件驱动编程:Lambda在Swing或JavaFX等...
Java线程池与Lambda表达式是Java开发中的重要概念,特别是在多线程编程和函数式编程领域。线程池是一种管理线程的技术,它能够有效地复用线程,避免频繁创建和销毁线程带来的开销,提高系统性能。在Java中,我们可以...
Java 8 中的 Lambda 表达式是一种强大的编程特性,它允许我们以更简洁的方式编写函数式代码。Lambda 表达式本质上是一个匿名方法,它没有名称,但可以具有...理解和熟练使用Lambda表达式是提升Java 8开发效率的关键。
1. **Lambda表达式**:Lambda表达式是Java 8的核心特性之一,它引入了函数式编程的概念。Lambda允许以更简洁的语法定义匿名函数,无需创建额外的类或方法。这种表达式使得代码更紧凑,减少了样板代码,尤其在处理...