Merge branch 'master' of https://github.com/eugenp/tutorials into task/BAEL-8142
This commit is contained in:
		
						commit
						cd1367756e
					
				| @ -87,7 +87,7 @@ public class State { | ||||
|     void randomPlay() { | ||||
|         List<Position> availablePositions = this.board.getEmptyPositions(); | ||||
|         int totalPossibilities = availablePositions.size(); | ||||
|         int selectRandom = (int) (Math.random() * ((totalPossibilities - 1) + 1)); | ||||
|         int selectRandom = (int) (Math.random() * totalPossibilities); | ||||
|         this.board.performMove(this.playerNo, availablePositions.get(selectRandom)); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -65,7 +65,7 @@ public class Node { | ||||
| 
 | ||||
|     public Node getRandomChildNode() { | ||||
|         int noOfPossibleMoves = this.childArray.size(); | ||||
|         int selectRandom = (int) (Math.random() * ((noOfPossibleMoves - 1) + 1)); | ||||
|         int selectRandom = (int) (Math.random() * noOfPossibleMoves); | ||||
|         return this.childArray.get(selectRandom); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -0,0 +1,35 @@ | ||||
| package com.baeldung.algorithms.string; | ||||
| 
 | ||||
| public class EnglishAlphabetLetters { | ||||
| 
 | ||||
|     public static boolean checkStringForAllTheLetters(String input) { | ||||
|         boolean[] visited = new boolean[26]; | ||||
| 
 | ||||
|         int index = 0; | ||||
| 
 | ||||
|         for (int id = 0; id < input.length(); id++) { | ||||
|             if ('a' <= input.charAt(id) && input.charAt(id) <= 'z') { | ||||
|                 index = input.charAt(id) - 'a'; | ||||
|             } else if ('A' <= input.charAt(id) && input.charAt(id) <= 'Z') { | ||||
|                 index = input.charAt(id) - 'A'; | ||||
|             } | ||||
|             visited[index] = true; | ||||
|         } | ||||
| 
 | ||||
|         for (int id = 0; id < 26; id++) { | ||||
|             if (!visited[id]) { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     public static boolean checkStringForAllLetterUsingStream(String input) { | ||||
|         long c = input.toLowerCase().chars().filter(ch -> ch >= 'a' && ch <= 'z').distinct().count(); | ||||
|         return c == 26; | ||||
|     } | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
|         checkStringForAllLetterUsingStream("intit"); | ||||
|     } | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms; | ||||
| package com.baeldung.algorithms; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms; | ||||
| package com.baeldung.algorithms; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms; | ||||
| package com.baeldung.algorithms; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms; | ||||
| package com.baeldung.algorithms; | ||||
| 
 | ||||
| import com.baeldung.algorithms.hillclimbing.HillClimbing; | ||||
| import com.baeldung.algorithms.hillclimbing.State; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms; | ||||
| package com.baeldung.algorithms; | ||||
| 
 | ||||
| import com.baeldung.algorithms.middleelementlookup.MiddleElementLookup; | ||||
| import com.baeldung.algorithms.middleelementlookup.Node; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms; | ||||
| package com.baeldung.algorithms; | ||||
| 
 | ||||
| import com.baeldung.algorithms.automata.*; | ||||
| import org.junit.Test; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms; | ||||
| package com.baeldung.algorithms; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms; | ||||
| package com.baeldung.algorithms; | ||||
| 
 | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms.binarysearch; | ||||
| package com.baeldung.algorithms.binarysearch; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms.mcts; | ||||
| package com.baeldung.algorithms.mcts; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| @ -1,4 +1,4 @@ | ||||
| package algorithms.minimax; | ||||
| package com.baeldung.algorithms.minimax; | ||||
| 
 | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| @ -0,0 +1,20 @@ | ||||
| package com.baeldung.algorithms.string; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Assertions; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| public class EnglishAlphabetLettersUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     void givenString_whenContainsAllCharacter_thenTrue() { | ||||
|         String input = "Farmer jack realized that big yellow quilts were expensive"; | ||||
|         Assertions.assertTrue(EnglishAlphabetLetters.checkStringForAllTheLetters(input)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenString_whenContainsAllCharacter_thenUsingStreamExpectTrue() { | ||||
|         String input = "Farmer jack realized that big yellow quilts were expensive"; | ||||
|         Assertions.assertTrue(EnglishAlphabetLetters.checkStringForAllLetterUsingStream(input)); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -9,15 +9,10 @@ | ||||
| - [Java 8 New Features](http://www.baeldung.com/java-8-new-features) | ||||
| - [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips) | ||||
| - [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator) | ||||
| - [Java 8 Streams Advanced](http://www.baeldung.com/java-8-streams) | ||||
| - [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction) | ||||
| - [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector) | ||||
| - [Strategy Design Pattern in Java 8](http://www.baeldung.com/java-strategy-pattern) | ||||
| - [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams) | ||||
| - [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions) | ||||
| - [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany) | ||||
| - [Guide to Java 8 Comparator.comparing()](http://www.baeldung.com/java-8-comparator-comparing) | ||||
| - [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element) | ||||
| - [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro) | ||||
| - [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api) | ||||
| - [Guide To Java 8 Optional](http://www.baeldung.com/java-optional) | ||||
| @ -27,15 +22,10 @@ | ||||
| - [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) | ||||
| - [Java Base64 Encoding and Decoding](http://www.baeldung.com/java-base64-encode-and-decode) | ||||
| - [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap) | ||||
| - [Merging Streams in Java](http://www.baeldung.com/java-merge-streams) | ||||
| - [“Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception) | ||||
| - [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones) | ||||
| - [Copy a File with Java](http://www.baeldung.com/java-copy-file) | ||||
| - [Static and Default Methods in Interfaces in Java](http://www.baeldung.com/java-static-default-methods) | ||||
| - [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream) | ||||
| - [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices) | ||||
| - [Efficient Word Frequency Calculator in Java](http://www.baeldung.com/java-word-frequency) | ||||
| - [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams) | ||||
| - [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator) | ||||
| - [Shuffling Collections In Java](http://www.baeldung.com/java-shuffle-collection) | ||||
| - [Introduction to Spliterator in Java](http://www.baeldung.com/java-spliterator) | ||||
|  | ||||
| @ -89,11 +89,6 @@ | ||||
|             <artifactId>vavr</artifactId> | ||||
|             <version>${vavr.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>one.util</groupId> | ||||
|             <artifactId>streamex</artifactId> | ||||
|             <version>${streamex.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>joda-time</groupId> | ||||
|             <artifactId>joda-time</artifactId> | ||||
| @ -177,7 +172,6 @@ | ||||
|         <lombok.version>1.16.12</lombok.version> | ||||
|         <vavr.version>0.9.0</vavr.version> | ||||
|         <protonpack.version>1.13</protonpack.version> | ||||
|         <streamex.version>0.6.5</streamex.version> | ||||
|         <joda.version>2.10</joda.version> | ||||
|         <!-- testing --> | ||||
|         <assertj.version>3.6.1</assertj.version> | ||||
|  | ||||
| @ -0,0 +1,21 @@ | ||||
| package com.baeldung.classcastexception; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class ClassCastException { | ||||
| 
 | ||||
| 	public static void main(String[] args) { | ||||
| 
 | ||||
| 		String p1 = new String("John"); | ||||
| 		String p2 = new String("Snow"); | ||||
| 		String[] strArray = new String[] { p1, p2 }; | ||||
| 		ArrayList<String> strList = (ArrayList<String>) Arrays.asList(strArray); | ||||
| 		// To fix the ClassCastException at above line, modify the code as: | ||||
| 		// List<String> strList = Arrays.asList(strArray); | ||||
| 		System.out.println("String list: " + strList); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -8,7 +8,7 @@ public class PersonRepository { | ||||
| 
 | ||||
|     @Nullable | ||||
|     public String findNameById(String id) { | ||||
|         return id == null ? null : "example-name"; | ||||
|         return id == null ? null : "Name"; | ||||
|     } | ||||
| 
 | ||||
|     public List<String> findAll() throws SQLException { | ||||
|  | ||||
| @ -4,6 +4,7 @@ import org.junit.Test; | ||||
| 
 | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertAll; | ||||
| import static org.junit.jupiter.api.Assertions.assertThrows; | ||||
| 
 | ||||
| @ -29,4 +30,14 @@ public class PersonRepositoryUnitTest { | ||||
|                                 .orElseThrow(Exception::new)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenIdIsNonNull_thenShouldReturnNameUpperCase() throws Exception { | ||||
|         String name = Optional | ||||
|                 .ofNullable(personRepository.findNameById("id")) | ||||
|                 .map(String::toUpperCase) | ||||
|                 .orElseThrow(Exception::new); | ||||
| 
 | ||||
|         assertEquals("NAME", name); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										26
									
								
								java-streams/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								java-streams/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| *.class | ||||
| 
 | ||||
| 0.* | ||||
| 
 | ||||
| #folders# | ||||
| /target | ||||
| /neoDb* | ||||
| /data | ||||
| /src/main/webapp/WEB-INF/classes | ||||
| */META-INF/* | ||||
| .resourceCache | ||||
| 
 | ||||
| # Packaged files # | ||||
| *.jar | ||||
| *.war | ||||
| *.ear | ||||
| 
 | ||||
| # Files generated by integration tests | ||||
| *.txt | ||||
| backup-pom.xml | ||||
| /bin/ | ||||
| /temp | ||||
| 
 | ||||
| #IntelliJ specific | ||||
| .idea/ | ||||
| *.iml | ||||
							
								
								
									
										14
									
								
								java-streams/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								java-streams/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| ========= | ||||
| 
 | ||||
| ## Java Streams Cookbooks and Examples | ||||
| 
 | ||||
| ### Relevant Articles:  | ||||
| - [Java 8 Streams Advanced](http://www.baeldung.com/java-8-streams) | ||||
| - [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction) | ||||
| - [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams) | ||||
| - [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany) | ||||
| - [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element) | ||||
| - [”Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception) | ||||
| - [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream) | ||||
| - [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices) | ||||
| - [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams) | ||||
							
								
								
									
										120
									
								
								java-streams/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								java-streams/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,120 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <groupId>com.baeldung</groupId> | ||||
|     <artifactId>java-streams</artifactId> | ||||
|     <version>0.1.0-SNAPSHOT</version> | ||||
|     <packaging>jar</packaging> | ||||
|     <name>java-streams</name> | ||||
| 
 | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|         <artifactId>parent-java</artifactId> | ||||
|         <version>0.0.1-SNAPSHOT</version> | ||||
|         <relativePath>../parent-java</relativePath> | ||||
|     </parent> | ||||
| 
 | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>org.apache.commons</groupId> | ||||
|             <artifactId>commons-lang3</artifactId> | ||||
|             <version>${commons-lang3.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>log4j</groupId> | ||||
|             <artifactId>log4j</artifactId> | ||||
|             <version>${log4j.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.projectlombok</groupId> | ||||
|             <artifactId>lombok</artifactId> | ||||
|             <version>${lombok.version}</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
|         <!-- test scoped --> | ||||
|         <dependency> | ||||
|             <groupId>org.assertj</groupId> | ||||
|             <artifactId>assertj-core</artifactId> | ||||
|             <version>${assertj.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>com.codepoetics</groupId> | ||||
|             <artifactId>protonpack</artifactId> | ||||
|             <version>${protonpack.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>io.vavr</groupId> | ||||
|             <artifactId>vavr</artifactId> | ||||
|             <version>${vavr.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>one.util</groupId> | ||||
|             <artifactId>streamex</artifactId> | ||||
|             <version>${streamex.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.aspectj</groupId> | ||||
|             <artifactId>aspectjrt</artifactId> | ||||
|             <version>${asspectj.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.aspectj</groupId> | ||||
|             <artifactId>aspectjweaver</artifactId> | ||||
|             <version>${asspectj.version}</version> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <build> | ||||
|         <finalName>java-streams</finalName> | ||||
|         <resources> | ||||
|             <resource> | ||||
|                 <directory>src/main/resources</directory> | ||||
|                 <filtering>true</filtering> | ||||
|             </resource> | ||||
|         </resources> | ||||
| 
 | ||||
|         <plugins> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-dependency-plugin</artifactId> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <id>copy-dependencies</id> | ||||
|                         <phase>prepare-package</phase> | ||||
|                         <goals> | ||||
|                             <goal>copy-dependencies</goal> | ||||
|                         </goals> | ||||
|                         <configuration> | ||||
|                             <outputDirectory>${project.build.directory}/libs</outputDirectory> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|             </plugin> | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>3.1</version> | ||||
|                 <configuration> | ||||
|                     <source>1.8</source> | ||||
|                     <target>1.8</target> | ||||
|                     <compilerArgument>-parameters</compilerArgument> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
|     </build> | ||||
| 
 | ||||
|     <properties> | ||||
|         <!-- util --> | ||||
|         <commons-lang3.version>3.5</commons-lang3.version> | ||||
|         <lombok.version>1.16.12</lombok.version> | ||||
|         <vavr.version>0.9.0</vavr.version> | ||||
|         <protonpack.version>1.13</protonpack.version> | ||||
|         <streamex.version>0.6.5</streamex.version> | ||||
|         <joda.version>2.10</joda.version> | ||||
|         <!-- testing --> | ||||
|         <assertj.version>3.6.1</assertj.version> | ||||
|         <asspectj.version>1.8.9</asspectj.version> | ||||
|     </properties> | ||||
| </project> | ||||
							
								
								
									
										13
									
								
								java-streams/src/main/resources/logback.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								java-streams/src/main/resources/logback.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <configuration> | ||||
|     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | ||||
|         <encoder> | ||||
|             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n | ||||
|             </pattern> | ||||
|         </encoder> | ||||
|     </appender> | ||||
| 
 | ||||
|     <root level="INFO"> | ||||
|         <appender-ref ref="STDOUT" /> | ||||
|     </root> | ||||
| </configuration> | ||||
							
								
								
									
										13
									
								
								java-streams/src/test/resources/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								java-streams/src/test/resources/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| *.class | ||||
| 
 | ||||
| #folders# | ||||
| /target | ||||
| /neoDb* | ||||
| /data | ||||
| /src/main/webapp/WEB-INF/classes | ||||
| */META-INF/* | ||||
| 
 | ||||
| # Packaged files # | ||||
| *.jar | ||||
| *.war | ||||
| *.ear | ||||
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							| @ -349,6 +349,7 @@ | ||||
| 				<module>core-java-collections</module> | ||||
| 				<module>core-java-io</module> | ||||
| 				<module>core-java-8</module> | ||||
| 				<module>java-streams</module> | ||||
|                 <module>core-java-persistence</module> | ||||
| 				<module>core-kotlin</module> | ||||
| 				<module>core-groovy</module> | ||||
| @ -903,6 +904,7 @@ | ||||
| 				<module>core-java-collections</module> | ||||
| 				<module>core-java-io</module> | ||||
| 				<module>core-java-8</module> | ||||
| 				<module>java-streams</module> | ||||
| 				<module>core-groovy</module> | ||||
| 
 | ||||
| 				<module>couchbase</module> | ||||
|  | ||||
							
								
								
									
										34
									
								
								testing-modules/streams-ordering/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								testing-modules/streams-ordering/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
|          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
| 
 | ||||
|     <groupId>com.baeldung</groupId> | ||||
|     <artifactId>StreamsOrdering</artifactId> | ||||
|     <version>1.0-SNAPSHOT</version> | ||||
| 
 | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>junit</groupId> | ||||
|             <artifactId>junit</artifactId> | ||||
|             <version>4.12</version> | ||||
|             <scope>test</scope> | ||||
| 
 | ||||
|         </dependency> | ||||
|         <!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core --> | ||||
|         <dependency> | ||||
|             <groupId>org.openjdk.jmh</groupId> | ||||
|             <artifactId>jmh-core</artifactId> | ||||
|             <version>1.21</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.openjdk.jmh</groupId> | ||||
|             <artifactId>jmh-generator-annprocess</artifactId> | ||||
|             <version>1.21</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
| 
 | ||||
|     </dependencies> | ||||
| </project> | ||||
| @ -0,0 +1,148 @@ | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.util.*; | ||||
| import java.util.function.Function; | ||||
| import java.util.logging.Level; | ||||
| import java.util.logging.Logger; | ||||
| import java.util.stream.Collectors; | ||||
| import java.util.stream.IntStream; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| 
 | ||||
| 
 | ||||
| public class StreamsOrderingTest { | ||||
| 
 | ||||
|   Logger logger = Logger.getLogger( StreamsOrderingTest.class.getName()); | ||||
| 
 | ||||
|   @Before | ||||
|   public void setUp() throws Exception { | ||||
|     logger.setLevel(Level.ALL); | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenTwoCollections_whenStreamed_thenCheckOutputDifferent(){ | ||||
| 
 | ||||
|     List<String> list = Arrays.asList("B", "A", "C", "D", "F"); | ||||
|     Set<String> set = new TreeSet<>(Arrays.asList("B", "A", "C", "D", "F")); | ||||
| 
 | ||||
|     Object[] listOutput = list.stream().toArray(); | ||||
|     Object[] setOutput = set.stream().toArray(); | ||||
| 
 | ||||
|     assertEquals("[B, A, C, D, F]", Arrays.toString(listOutput)); | ||||
|     assertEquals("[A, B, C, D, F]", Arrays.toString(setOutput)); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenTwoCollections_whenStreamedInParallel_thenCheckOutputDifferent(){ | ||||
| 
 | ||||
|     List<String> list = Arrays.asList("B", "A", "C", "D", "F"); | ||||
|     Set<String> set = new TreeSet<>(Arrays.asList("B", "A", "C", "D", "F")); | ||||
| 
 | ||||
|     Object[] listOutput = list.stream().parallel().toArray(); | ||||
|     Object[] setOutput = set.stream().parallel().toArray(); | ||||
| 
 | ||||
|     assertEquals("[B, A, C, D, F]", Arrays.toString(listOutput)); | ||||
|     assertEquals("[A, B, C, D, F]", Arrays.toString(setOutput)); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenOrderedInput_whenUnorderedAndOrderedCompared_thenCheckUnorderedOutputChanges(){ | ||||
|     Set<Integer> set = new TreeSet<>( | ||||
|       Arrays.asList(-9, -5, -4, -2, 1, 2, 4, 5, 7, 9, 12, 13, 16, 29, 23, 34, 57, 68, 90, 102, 230)); | ||||
| 
 | ||||
|       Object[] orderedArray = set.stream() | ||||
|         .parallel() | ||||
|         .limit(5) | ||||
|         .toArray(); | ||||
|       Object[] unorderedArray = set.stream() | ||||
|         .unordered() | ||||
|         .parallel() | ||||
|         .limit(5) | ||||
|         .toArray(); | ||||
| 
 | ||||
|      logger.info(Arrays.toString(orderedArray)); | ||||
|      logger.info(Arrays.toString(unorderedArray)); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenUnsortedStreamInput_whenStreamSorted_thenCheckOrderChanged(){ | ||||
| 
 | ||||
|     List<Integer> list = Arrays.asList(-3,10,-4,1,3); | ||||
| 
 | ||||
|     Object[] listOutput = list.stream().toArray(); | ||||
|     Object[] listOutputSorted = list.stream().sorted().toArray(); | ||||
| 
 | ||||
|     assertEquals("[-3, 10, -4, 1, 3]", Arrays.toString(listOutput)); | ||||
|     assertEquals("[-4, -3, 1, 3, 10]", Arrays.toString(listOutputSorted)); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenUnsortedStreamInput_whenStreamDistinct_thenShowTimeTaken(){ | ||||
|     long start, end; | ||||
|     start = System.currentTimeMillis(); | ||||
|     IntStream.range(1,1_000_000).unordered().parallel().distinct().toArray(); | ||||
|     end = System.currentTimeMillis(); | ||||
|     System.out.println(String.format("Time taken when unordered: %d ms", (end - start))); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenSameCollection_whenStreamTerminated_thenCheckEachVsEachOrdered(){ | ||||
| 
 | ||||
|     List<String> list = Arrays.asList("B", "A", "C", "D", "F"); | ||||
| 
 | ||||
|     list.stream().parallel().forEach(e -> logger.log(Level.INFO, e)); | ||||
|     list.stream().parallel().forEachOrdered(e -> logger.log(Level.INFO, e)); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenSameCollection_whenStreamCollected_thenCheckOutput(){ | ||||
| 
 | ||||
|     List<String> list = Arrays.asList("B", "A", "C", "D", "F"); | ||||
| 
 | ||||
|     List<String> collectionList = list.stream().parallel().collect(Collectors.toList()); | ||||
|     Set<String> collectionSet = list.stream().parallel().collect(Collectors.toCollection(TreeSet::new)); | ||||
| 
 | ||||
|     assertEquals("[B, A, C, D, F]", collectionList.toString()); | ||||
|     assertEquals("[A, B, C, D, F]", collectionSet.toString()); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenListIterationOrder_whenStreamCollectedToMap_thenCeckOrderChanged() { | ||||
|     List<String> list = Arrays.asList("A", "BB", "CCC"); | ||||
| 
 | ||||
|     Map<String, Integer> hashMap = list.stream().collect(Collectors.toMap(Function.identity(), String::length)); | ||||
| 
 | ||||
|     Object[] keySet = hashMap.keySet().toArray(); | ||||
| 
 | ||||
|     assertEquals("[BB, A, CCC]", Arrays.toString(keySet)); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void givenListIteration_whenStreamCollectedtoHashMap_thenCheckOrderMaintained() { | ||||
|     List<String> list = Arrays.asList("A", "BB", "CCC", "CCC"); | ||||
| 
 | ||||
|     Map<String, Integer> linkedHashMap = list.stream().collect(Collectors.toMap( | ||||
|       Function.identity(), | ||||
|       String::length, | ||||
|       (u, v) -> u, | ||||
|       LinkedHashMap::new | ||||
|     )); | ||||
| 
 | ||||
|     Object[] keySet = linkedHashMap.keySet().toArray(); | ||||
| 
 | ||||
|     assertEquals("[A, BB, CCC]", Arrays.toString(keySet)); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,97 @@ | ||||
| package benchmarking; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| import org.openjdk.jmh.annotations.*; | ||||
| import org.openjdk.jmh.infra.Blackhole; | ||||
| import org.openjdk.jmh.runner.Runner; | ||||
| import org.openjdk.jmh.runner.options.Options; | ||||
| import org.openjdk.jmh.runner.options.OptionsBuilder; | ||||
| import org.openjdk.jmh.runner.options.TimeValue; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Random; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.stream.IntStream; | ||||
| 
 | ||||
| 
 | ||||
| public class TestBenchmark | ||||
| { | ||||
| 
 | ||||
|   @Test | ||||
|   public void | ||||
|   launchBenchmark() throws Exception { | ||||
| 
 | ||||
|     Options opt = new OptionsBuilder() | ||||
|       // Specify which benchmarks to run. | ||||
|       // You can be more specific if you'd like to run only one benchmark per test. | ||||
|       .include(this.getClass().getName() + ".*") | ||||
|       // Set the following options as needed | ||||
|       .mode (Mode.AverageTime) | ||||
|       .timeUnit(TimeUnit.MICROSECONDS) | ||||
|       .warmupTime(TimeValue.seconds(1)) | ||||
|       .warmupIterations(2) | ||||
|       .measurementTime(TimeValue.seconds(1)) | ||||
|       .measurementIterations(2) | ||||
|       .threads(2) | ||||
|       .forks(1) | ||||
|       .shouldFailOnError(true) | ||||
|       .shouldDoGC(true) | ||||
|       //.jvmArgs("-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining") | ||||
|       //.addProfiler(WinPerfAsmProfiler.class) | ||||
|       .build(); | ||||
| 
 | ||||
|     new Runner(opt).run(); | ||||
| 
 | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   @Benchmark | ||||
|   public void givenOrderedStreamInput_whenStreamFiltered_showOpsPerMS(){ | ||||
|     IntStream.range(1, 100_000_000).parallel().filter(i -> i % 10 == 0).toArray(); | ||||
|   } | ||||
| 
 | ||||
|   @Benchmark | ||||
|   public void givenUnorderedStreamInput_whenStreamFiltered_showOpsPerMS(){ | ||||
|     IntStream.range(1,100_000_000).unordered().parallel().filter(i -> i % 10 == 0).toArray(); | ||||
|   } | ||||
| 
 | ||||
|   @Benchmark | ||||
|   public void givenUnorderedStreamInput_whenStreamDistinct_showOpsPerMS(){ | ||||
|     IntStream.range(1, 1_000_000).unordered().parallel().distinct().toArray(); | ||||
|   } | ||||
| 
 | ||||
|   @Benchmark | ||||
|   public void givenOrderedStreamInput_whenStreamDistinct_showOpsPerMS() { | ||||
|     //section 5.1. | ||||
|     IntStream.range(1, 1_000_000).parallel().distinct().toArray(); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   // The JMH samples are the best documentation for how to use it | ||||
|   // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/ | ||||
|   @State(Scope.Thread) | ||||
|   public static class BenchmarkState | ||||
|   { | ||||
|     List<Integer> list; | ||||
| 
 | ||||
|     @Setup(Level.Trial) public void | ||||
|     initialize() { | ||||
| 
 | ||||
|       Random rand = new Random(); | ||||
| 
 | ||||
|       list = new ArrayList<>(); | ||||
|       for (int i = 0; i < 1000; i++) | ||||
|         list.add (rand.nextInt()); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @Benchmark public void | ||||
|   benchmark1 (BenchmarkState state, Blackhole bh) { | ||||
| 
 | ||||
|     List<Integer> list = state.list; | ||||
| 
 | ||||
|     for (int i = 0; i < 1000; i++) | ||||
|       bh.consume (list.get (i)); | ||||
|   } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user