Merge branch 'master' of https://github.com/eugenp/tutorials
This commit is contained in:
commit
0a01434a1d
|
@ -87,7 +87,7 @@ public class State {
|
||||||
void randomPlay() {
|
void randomPlay() {
|
||||||
List<Position> availablePositions = this.board.getEmptyPositions();
|
List<Position> availablePositions = this.board.getEmptyPositions();
|
||||||
int totalPossibilities = availablePositions.size();
|
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));
|
this.board.performMove(this.playerNo, availablePositions.get(selectRandom));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class Node {
|
||||||
|
|
||||||
public Node getRandomChildNode() {
|
public Node getRandomChildNode() {
|
||||||
int noOfPossibleMoves = this.childArray.size();
|
int noOfPossibleMoves = this.childArray.size();
|
||||||
int selectRandom = (int) (Math.random() * ((noOfPossibleMoves - 1) + 1));
|
int selectRandom = (int) (Math.random() * noOfPossibleMoves);
|
||||||
return this.childArray.get(selectRandom);
|
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.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
|
@ -1,4 +1,4 @@
|
||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
|
@ -1,4 +1,4 @@
|
||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
import org.junit.Test;
|
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.HillClimbing;
|
||||||
import com.baeldung.algorithms.hillclimbing.State;
|
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.MiddleElementLookup;
|
||||||
import com.baeldung.algorithms.middleelementlookup.Node;
|
import com.baeldung.algorithms.middleelementlookup.Node;
|
|
@ -1,4 +1,4 @@
|
||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
import com.baeldung.algorithms.automata.*;
|
import com.baeldung.algorithms.automata.*;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
|
@ -1,4 +1,4 @@
|
||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
|
@ -1,4 +1,4 @@
|
||||||
package algorithms;
|
package com.baeldung.algorithms;
|
||||||
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
|
@ -1,4 +1,4 @@
|
||||||
package algorithms.binarysearch;
|
package com.baeldung.algorithms.binarysearch;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
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.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
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.Before;
|
||||||
import org.junit.Test;
|
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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [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)
|
- [Shuffling Collections In Java](http://www.baeldung.com/java-shuffle-collection)
|
||||||
- [Introduction to Spliterator in Java](http://www.baeldung.com/java-spliterator)
|
- [Introduction to Spliterator in Java](http://www.baeldung.com/java-spliterator)
|
||||||
|
|
|
@ -89,11 +89,6 @@
|
||||||
<artifactId>vavr</artifactId>
|
<artifactId>vavr</artifactId>
|
||||||
<version>${vavr.version}</version>
|
<version>${vavr.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>one.util</groupId>
|
|
||||||
<artifactId>streamex</artifactId>
|
|
||||||
<version>${streamex.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>joda-time</groupId>
|
<groupId>joda-time</groupId>
|
||||||
<artifactId>joda-time</artifactId>
|
<artifactId>joda-time</artifactId>
|
||||||
|
@ -177,7 +172,6 @@
|
||||||
<lombok.version>1.16.12</lombok.version>
|
<lombok.version>1.16.12</lombok.version>
|
||||||
<vavr.version>0.9.0</vavr.version>
|
<vavr.version>0.9.0</vavr.version>
|
||||||
<protonpack.version>1.13</protonpack.version>
|
<protonpack.version>1.13</protonpack.version>
|
||||||
<streamex.version>0.6.5</streamex.version>
|
|
||||||
<joda.version>2.10</joda.version>
|
<joda.version>2.10</joda.version>
|
||||||
<!-- testing -->
|
<!-- testing -->
|
||||||
<assertj.version>3.6.1</assertj.version>
|
<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
|
@Nullable
|
||||||
public String findNameById(String id) {
|
public String findNameById(String id) {
|
||||||
return id == null ? null : "example-name";
|
return id == null ? null : "Name";
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> findAll() throws SQLException {
|
public List<String> findAll() throws SQLException {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Optional;
|
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.assertAll;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
|
||||||
|
@ -29,4 +30,14 @@ public class PersonRepositoryUnitTest {
|
||||||
.orElseThrow(Exception::new));
|
.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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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
|
|
@ -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)
|
|
@ -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>
|
|
@ -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>
|
|
@ -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
|
@ -348,6 +348,7 @@
|
||||||
<module>core-java-collections</module>
|
<module>core-java-collections</module>
|
||||||
<module>core-java-io</module>
|
<module>core-java-io</module>
|
||||||
<module>core-java-8</module>
|
<module>core-java-8</module>
|
||||||
|
<module>java-streams</module>
|
||||||
<module>core-java-persistence</module>
|
<module>core-java-persistence</module>
|
||||||
<module>core-kotlin</module>
|
<module>core-kotlin</module>
|
||||||
<module>core-groovy</module>
|
<module>core-groovy</module>
|
||||||
|
@ -902,6 +903,7 @@
|
||||||
<module>core-java-collections</module>
|
<module>core-java-collections</module>
|
||||||
<module>core-java-io</module>
|
<module>core-java-io</module>
|
||||||
<module>core-java-8</module>
|
<module>core-java-8</module>
|
||||||
|
<module>java-streams</module>
|
||||||
<module>core-groovy</module>
|
<module>core-groovy</module>
|
||||||
|
|
||||||
<module>couchbase</module>
|
<module>couchbase</module>
|
||||||
|
|
|
@ -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…
Reference in New Issue