Java 8流:Micro Katas

编程kata是一种练习,可以帮助程序员通过练习和重复练习来磨练自己的技能。

本文是“ 通过Katas进行Java教程 ”系列的一部分。

本文假定读者已经具有Java的经验,熟悉单元测试的基础知识,并且知道如何从他最喜欢的IDE(我是IntelliJ IDEA )运行它们。

下面显示的练习背后的想法是,使用测试驱动的开发方法来学习Java 8 Streaming(编写第一个测试的实现,确认它通过并转到下一个测试)。

每个部分都将以测试形式的目标开始,以证明实现一旦编写便是正确的。 这些测试中的每一个都在Java 7(或更早版本)和Java 8中使用Streams进行了一种可能的实现。 这样,读者可以将Java 8的某些新功能与早期JDK中的等效功能进行比较。 请尝试解决测试,而不查看提供的解决方案。

有关TDD最佳实践的更多信息,请阅读“ 测试驱动开发(TDD):使用Java示例的最佳实践” 。

Java 8地图

将集合的元素转换为大写。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;import static com.technologyconversations.java8exercises.streams.ToUpperCase.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Convert elements of a collection to upper case.*/
public class ToUpperCaseSpec {@Testpublic void transformShouldConvertCollectionElementsToUpperCase() {List<String> collection = asList("My"< "name"< "is"< "John"< "Doe");List<String> expected = asList("MY"< "NAME"< "IS"< "JOHN"< "DOE");assertThat(transform(collection)).hasSameElementsAs(expected);}}

Java 7(transform7)和Java8(transform)实现

package com.technologyconversations.java8exercises.streams;import java.util.ArrayList;
import java.util.List;import static java.util.stream.Collectors.toList;public class ToUpperCase {public static List<String> transform7(List<String> collection) {List<String> coll = new ArrayList<>();for (String element : collection) {coll.add(element.toUpperCase());}return coll;}public static List<String> transform(List<String> collection) {return collection.stream() // Convert collection to Stream.map(String::toUpperCase) // Convert each element to upper case.collect(toList()); // Collect results to a new list}}

Java 8过滤器

过滤集合,以便仅返回少于4个字符的元素。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;import static com.technologyconversations.java8exercises.streams.FilterCollection.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Filter collection so that only elements with less then 4 characters are returned.*/
public class FilterCollectionSpec {@Testpublic void transformShouldFilterCollection() {List<String> collection = asList("My", "name", "is", "John", "Doe");List<String> expected = asList("My", "is", "Doe");assertThat(transform(collection)).hasSameElementsAs(expected);}}

Java 7(transform7)和Java8(transform)实现

package com.technologyconversations.java8exercises.streams;import java.util.ArrayList;
import java.util.List;import static java.util.stream.Collectors.toList;public class FilterCollection {public static List<String> transform7(List<String> collection) {List<String> newCollection = new ArrayList<>();for (String element : collection) {if (element.length() < 4) {newCollection.add(element);}}return newCollection;}public static List<String> transform(List<String> collection) {return collection.stream() // Convert collection to Stream.filter(value -> value.length() < 4) // Filter elements with length smaller than 4 characters.collect(toList()); // Collect results to a new list}}

Java 8 FlatMap

展平多维集合。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;import static com.technologyconversations.java8exercises.streams.FlatCollection.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Flatten multidimensional collection*/
public class FlatCollectionSpec {@Testpublic void transformShouldFlattenCollection() {List<List<String>> collection = asList(asList("Viktor", "Farcic"), asList("John", "Doe", "Third"));List<String> expected = asList("Viktor", "Farcic", "John", "Doe", "Third");assertThat(transform(collection)).hasSameElementsAs(expected);}}

Java 7(transform7)和Java8(transform)实现

package com.technologyconversations.java8exercises.streams;import java.util.ArrayList;
import java.util.List;import static java.util.stream.Collectors.toList;public class FlatCollection {public static List<String> transform7(List<List<String>> collection) {List<String> newCollection = new ArrayList<>();for (List<String> subCollection : collection) {for (String value : subCollection) {newCollection.add(value);}}return newCollection;}public static List<String> transform(List<List<String>> collection) {return collection.stream() // Convert collection to Stream.flatMap(value -> value.stream()) // Replace list with stream.collect(toList()); // Collect results to a new list}}

Java 8 Max和比较器

从集合中获取最老的人。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;import static com.technologyconversations.java8exercises.streams.OldestPerson.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Get oldest person from the collection*/
public class OldestPersonSpec {@Testpublic void getOldestPersonShouldReturnOldestPerson() {Person sara = new Person("Sara", 4);Person viktor = new Person("Viktor", 40);Person eva = new Person("Eva", 42);List<Person> collection = asList(sara, eva, viktor);assertThat(getOldestPerson(collection)).isEqualToComparingFieldByField(eva);}}

Java 7(getOldestPerson7)和Java8(getOldestPerson)实现

package com.technologyconversations.java8exercises.streams;import java.util.Comparator;
import java.util.List;public class OldestPerson {public static Person getOldestPerson7(List<Person> people) {Person oldestPerson = new Person("", 0);for (Person person : people) {if (person.getAge() > oldestPerson.getAge()) {oldestPerson = person;}}return oldestPerson;}public static Person getOldestPerson(List<Person> people) {return people.stream() // Convert collection to Stream.max(Comparator.comparing(Person::getAge)) // Compares people ages.get(); // Gets stream result}}

Java 8之和

对集合的所有元素求和。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;import static com.technologyconversations.java8exercises.streams.Sum.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Sum all elements of a collection*/
public class SumSpec {@Testpublic void transformShouldConvertCollectionElementsToUpperCase() {List<Integer> numbers = asList(1, 2, 3, 4, 5);assertThat(calculate(numbers)).isEqualTo(1 + 2 + 3 + 4 + 5);}}

Java 7(calculate7)和Java8(calculate)实现

package com.technologyconversations.java8exercises.streams;import java.util.List;public class Sum {public static int calculate7(List<Integer> numbers) {int total = 0;for (int number : numbers) {total += number;}return total;}public static int calculate(List<Integer> people) {return people.stream() // Convert collection to Stream.reduce(0, (total, number) -> total + number); // Sum elements with 0 as starting value}}

Java 8过滤器和映射

获取所有孩子(18岁以下)的名字。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;import static com.technologyconversations.java8exercises.streams.Kids.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Get names of all kids (under age of 18)*/
public class KidsSpec {@Testpublic void getKidNameShouldReturnNamesOfAllKidsFromNorway() {Person sara = new Person("Sara", 4);Person viktor = new Person("Viktor", 40);Person eva = new Person("Eva", 42);Person anna = new Person("Anna", 5);List<Person> collection = asList(sara, eva, viktor, anna);assertThat(getKidNames(collection)).contains("Sara", "Anna").doesNotContain("Viktor", "Eva");}}

Java 7(getKidNames7)和Java8(getKidNames)实现

package com.technologyconversations.java8exercises.streams;import java.util.*;import static java.util.stream.Collectors.toSet;public class Kids {public static Set<String> getKidNames7(List<Person> people) {Set<String> kids = new HashSet<>();for (Person person : people) {if (person.getAge() < 18) {kids.add(person.getName());}}return kids;}public static Set<String> getKidNames(List<Person> people) {return people.stream().filter(person -> person.getAge() < 18) // Filter kids (under age of 18).map(Person::getName) // Map Person elements to names.collect(toSet()); // Collect values to a Set}}

Java 8摘要统计

获取人员统计信息:平均年龄,人数,最大年龄,最小年龄和所有年龄的总和。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;import static com.technologyconversations.java8exercises.streams.PeopleStats.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Get people statistics: average age, count, maximum age, minimum age and sum og all ages.*/
public class PeopleStatsSpec {Person sara = new Person("Sara", 4);Person viktor = new Person("Viktor", 40);Person eva = new Person("Eva", 42);List<Person> collection = asList(sara, eva, viktor);@Testpublic void getStatsShouldReturnAverageAge() {assertThat(getStats(collection).getAverage()).isEqualTo((double)(4 + 40 + 42) / 3);}@Testpublic void getStatsShouldReturnNumberOfPeople() {assertThat(getStats(collection).getCount()).isEqualTo(3);}@Testpublic void getStatsShouldReturnMaximumAge() {assertThat(getStats(collection).getMax()).isEqualTo(42);}@Testpublic void getStatsShouldReturnMinimumAge() {assertThat(getStats(collection).getMin()).isEqualTo(4);}@Testpublic void getStatsShouldReturnSumOfAllAges() {assertThat(getStats(collection).getSum()).isEqualTo(40 + 42 + 4);}}

Java 7(getStats7)和Java8(getStats)实现

package com.technologyconversations.java8exercises.streams;import java.util.IntSummaryStatistics;
import java.util.List;public class PeopleStats {public static Stats getStats7(List<Person> people) {long sum = 0;int min = people.get(0).getAge();int max = 0;for (Person person : people) {int age = person.getAge();sum += age;min = Math.min(min, age);max = Math.max(max, age);}return new Stats(people.size(), sum, min, max);}public static IntSummaryStatistics getStats(List<Person> people) {return people.stream().mapToInt(Person::getAge).summaryStatistics();}}

Java 8分区

分区成人和孩子。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;
import java.util.Map;import static com.technologyconversations.java8exercises.streams.Partitioning.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Partition adults and kids*/
public class PartitioningSpec {@Testpublic void partitionAdultsShouldSeparateKidsFromAdults() {Person sara = new Person("Sara", 4);Person viktor = new Person("Viktor", 40);Person eva = new Person("Eva", 42);List<Person> collection = asList(sara, eva, viktor);Map<Boolean, List<Person>> result = partitionAdults(collection);assertThat(result.get(true)).hasSameElementsAs(asList(viktor, eva));assertThat(result.get(false)).hasSameElementsAs(asList(sara));}}

Java 7(partitionAdults7)和Java8(partitionAdults)实现

package com.technologyconversations.java8exercises.streams;import java.util.*;
import static java.util.stream.Collectors.*;public class Partitioning {public static Map<Boolean, List<Person>> partitionAdults7(List<Person> people) {Map<Boolean, List<Person>> map = new HashMap<>();map.put(true, new ArrayList<>());map.put(false, new ArrayList<>());for (Person person : people) {map.get(person.getAge() >= 18).add(person);}return map;}public static Map<Boolean, List<Person>> partitionAdults(List<Person> people) {return people.stream() // Convert collection to Stream.collect(partitioningBy(p -> p.getAge() >= 18)); // Partition stream of people into adults (age => 18) and kids}}

Java 8分组

按国籍分组人。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;
import java.util.Map;import static com.technologyconversations.java8exercises.streams.Grouping.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Group people by nationality*/
public class GroupingSpec {@Testpublic void partitionAdultsShouldSeparateKidsFromAdults() {Person sara = new Person("Sara", 4, "Norwegian");Person viktor = new Person("Viktor", 40, "Serbian");Person eva = new Person("Eva", 42, "Norwegian");List<Person> collection = asList(sara, eva, viktor);Map<String, List<Person>> result = groupByNationality(collection);assertThat(result.get("Norwegian")).hasSameElementsAs(asList(sara, eva));assertThat(result.get("Serbian")).hasSameElementsAs(asList(viktor));}}

Java 7(groupByNationality7)和Java8(groupByNationality)实现

package com.technologyconversations.java8exercises.streams;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import static java.util.stream.Collectors.*;public class Grouping {public static Map<String, List<Person>> groupByNationality7(List<Person> people) {Map<String, List<Person>> map = new HashMap<>();for (Person person : people) {if (!map.containsKey(person.getNationality())) {map.put(person.getNationality(), new ArrayList<>());}map.get(person.getNationality()).add(person);}return map;}public static Map<String, List<Person>> groupByNationality(List<Person> people) {return people.stream() // Convert collection to Stream.collect(groupingBy(Person::getNationality)); // Group people by nationality}}

Java 8加入

返回用逗号分隔的人名。

测验

package com.technologyconversations.java8exercises.streams;import org.junit.Test;import java.util.List;import static com.technologyconversations.java8exercises.streams.Joining.namesToString;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;/*
Return people names separated by comma*/
public class JoiningSpec {@Testpublic void toStringShouldReturnPeopleNamesSeparatedByComma() {Person sara = new Person("Sara", 4);Person viktor = new Person("Viktor", 40);Person eva = new Person("Eva", 42);List<Person> collection = asList(sara, viktor, eva);assertThat(namesToString(collection)).isEqualTo("Names: Sara, Viktor, Eva.");}}

Java 7(namesToString7)和Java8(namesToString)实现

package com.technologyconversations.java8exercises.streams;import java.util.List;import static java.util.stream.Collectors.joining;public class Joining {public static String namesToString7(List<Person> people) {String label = "Names: ";StringBuilder sb = new StringBuilder(label);for (Person person : people) {if (sb.length() > label.length()) {sb.append(", ");}sb.append(person.getName());}sb.append(".");return sb.toString();}public static String namesToString(List<Person> people) {return people.stream() // Convert collection to Stream.map(Person::getName) // Map Person to name.collect(joining(", ", "Names: ", ".")); // Join names}}

资源

完整源代码位于GitHub存储库https://github.com/vfarcic/java-8-exercises中 。 除了测试和实现之外,存储库还包含build.gradle,除其他外,build.gradle可用于下载AssertJ依赖项并运行测试。

翻译自: https://www.javacodegeeks.com/2014/11/java-8-streams-micro-katas.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Effective Java第七条:避免使用终结方法

第七条&#xff1a;避免使用终结方法 1&#xff0c; 终结方法&#xff08;finalizer&#xff09;会让程序不稳定&#xff0c;性能降低&#xff0c;出现可移植性的问题。 2&#xff0c; Finalizer在c中师析构器&#xff08;destructors&#xff09;的一部分&#xff0c;用作回…

python3基础:字符串、文本文件

字符串&#xff1a; 练习1&#xff1a; str "大胖三百磅不是二百磅陪着一百磅的小胖" print(str.replace("磅", "斤")) # 替换所有 print(str.replace("磅", "斤", 2)) # 替换两次len len(str) # 这句话的字数长度 pri…

[Python][小知识][NO.3] Python 使用系统默认浏览器打开指定URL的网址

1、前言 一般用到的地方&#xff1a; GUI交互界面下&#xff0c;单击某个按钮实现打开指定网址。 某帮助菜单项目&#xff0c;需要跳转网页显示时。 O.O 某XX程序&#xff0c;需要植入网页弹窗广告时... 2、方法 调用 webbrowser 包中的 open 函数即可。 (没安装该包的 CMD命令…

全部关于测试–第1部分

这是三个系列文章中的第一篇。 测试思路 技术技巧 工具和提示 心态 测试代码是需要学习的东西。 需要花费时间来吸收如何做好。 这是一种应该始终练习和改进的技巧。 过去&#xff0c;开发人员没有进行测试&#xff0c;而是检查了他们的代码。 这是一个很好的技巧&#xf…

利用数据库创建webservice

http://www.cnblogs.com/yungboy/archive/2011/11/07/2239642.html转载于:https://www.cnblogs.com/mingyongcheng/archive/2012/03/08/2385242.html

ASP.NET AJAX Debugging and Tracing

Moved to http://blog.tangcs.com/2008/09/30/asp-net-ajax-debugging-and-tracing/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/09/30/1302328.html

JS中编码操作

常见的网页设计编码&#xff1a;Unicode的UCS-2 UCS-4 UTF-8 UTF-16 UTF-32以及ASCII和ANSI。 要知道JS最初定稿时使用的编码是UCS-2&#xff08;因为那时候还没UTF-16&#xff0c;本质&#xff1a;UTF-16就是对UCS-2的扩展&#xff0c;前面的65536个字符就是UCS-2本身&#x…

Apache Commons IO教程:初学者指南

Apache Commons IO是由Apache Foundation创建和维护的Java库。 它提供了许多类&#xff0c;使开发人员可以轻松地完成常见任务&#xff0c;并且减少样板代码 &#xff0c;而每个项目都需要一遍又一遍地编写此类库的重要性是巨大的&#xff0c;因为它们已经成熟由经验丰富的开发…

MyEclipse 10优化技巧

MyEclipse 10优化速度方案仍然主要有这么几个方面&#xff1a;去除无需加载的模块、取消冗余的配置、去除不必要的检查、关闭更新。第一步: 去除不需要加载的模块一个系统20%的功能往往能够满足80%的需求&#xff0c;MyEclipse也不例外&#xff0c;我们在大多数时候只需要20%的…

为什么应该避免JSF

长期以来&#xff0c;对我来说&#xff0c;JSF只是另一个我不太在乎的Web框架。 这改变了。 在被迫使用了几个月之后&#xff0c;我认为在几乎所有情况下&#xff0c;这都是重大的项目风险。 在这里&#xff0c;我提出此判决的理由。 UI和处理逻辑的纠缠不清。 官方教程声称以…

HTML知识点总结之img、scirpt、link标签

<img>元素 使用<img>可以在网页插入一个图片&#xff0c;但实际上<img>标签并不会在网页中直接插入图像&#xff0c;而是从网页上链接图像。 <img>的主要属性 &#xff08;1&#xff09;src属性&#xff1a;图片的路径。 &#xff08;2&#xff09;alt…

更多 Kinect for Windows 项目揭示

虽然Kinect for Windows的发布不过才过去一个月而已&#xff0c;但是到目前为止这个Xbox 360游戏设备辅助产品似乎已经赶上了一些商业企业项目了。其中包括一个让机器人自动购物车成为现实的项目。在Microsoft Power and Utilities博客 的一篇博文中&#xff0c;微软列举了一些…

CSS3的常用属性(一)

选择器 属性选择器&#xff08;通过标签属性来选择&#xff09; E[attr]&#xff1a; 表示只要元素<E>存在属性attr就能被选中 如&#xff1a; div[class]E[attrval]&#xff1a; 表示元素<E>存在属性attr的值等于val&#xff0c;即可被选中 如&#xff1a; di…

问题集锦

1、viewpager 用到了ViewPager&#xff0c;Android5.0.1&#xff0c;却额外在Build Path中引入了v4jar包&#xff0c;并且在“Order and Export”中勾选了此jar包&#xff0c;编译时出现错误&#xff1a; [2014-09-28 23:49:30 - Dex Loader] Unable to execute dex: Multiple …

ImageField,FileField上传文件命名问题

django 的models.ImageFiled,FileField有属性upload_to&#xff0c;该属性是指定将文件上传到服务器的位置&#xff0c;及存储在哪个文件夹下&#xff0c;你可以很方便甚至很少的代码就可以实现文件上传操作了。 但是默认的存储的文件名是没有改变的&#xff0c;也就是说所存储…

Spring靴子战争包装

Spring Boot建议在构建期间使用嵌入式容器&#xff08;tomcat或码头&#xff09;创建一个可执行jar&#xff0c;并在运行时将此可执行jar作为独立进程使用。 但是&#xff0c;通常将应用程序部署到外部容器上是很常见的&#xff0c;Spring Boot提供了打包应用程序的方式&#x…

递归函数

递归函数实在一个函数通过名字调用自身的情况下构成的。 1 window.onload function() {2 var a factorial;3 factorial null;4 alert(a(4));5 };6 7 /**8 * 叠乘9 * param {叠乘的基数} num n 10 * return {叠乘结果} n*(n-1)*(n-2)*...*1 11 */…

正则表达式及测试工具

1. 正则表达式 正则表达式&#xff1a;一种匹配文本中的字符序列的字符模式。在很多文本编辑器或其他工具里&#xff0c;正则表达式通常被用来检索或替换那些符合某种模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。 一个正则表达式就是由普通字符&…

CCD与CMOS摄像头的区别

首先说一下在闭路电视监控中摄像机的CCD 和CMOS 的结构&#xff0c;ADC的位置和数量是最大的不同。简单的说&#xff0c;CCD每曝光一次&#xff0c;在快门关闭后进行像素转移处理&#xff0c;将每一行中每一个像素&#xff08;pixel&#xff09;的电荷信号依序传入“缓冲器”中…

Java注释教程– ULTIMATE指南(PDF下载)

编者注&#xff1a;在本文中&#xff0c;我们提供了全面的Java注释教程。 Java中的注释是一项主要功能&#xff0c;每个Java开发人员都应该知道如何使用它们。 我们在Java Code Geeks上提供了许多教程&#xff0c;例如创建自己的Java注释 &#xff0c; 带有自定义注释的Java注…