diff --git a/guava18/.classpath b/guava18/.classpath
new file mode 100644
index 0000000000..8ebf6d9c31
--- /dev/null
+++ b/guava18/.classpath
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/guava18/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch b/guava18/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch
new file mode 100644
index 0000000000..627021fb96
--- /dev/null
+++ b/guava18/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator.launch
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/guava18/.gitignore b/guava18/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/guava18/.gitignore
@@ -0,0 +1,13 @@
+*.class
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+
+# Packaged files #
+*.jar
+*.war
+*.ear
\ No newline at end of file
diff --git a/guava18/.project b/guava18/.project
new file mode 100644
index 0000000000..829dc83809
--- /dev/null
+++ b/guava18/.project
@@ -0,0 +1,36 @@
+
+
+ guava
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.eclipse.wst.validation.validationbuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jem.workbench.JavaEMFNature
+ org.eclipse.wst.common.modulecore.ModuleCoreNature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.wst.common.project.facet.core.nature
+
+
diff --git a/guava18/.springBeans b/guava18/.springBeans
new file mode 100644
index 0000000000..a79097f40d
--- /dev/null
+++ b/guava18/.springBeans
@@ -0,0 +1,14 @@
+
+
+ 1
+
+
+
+
+
+
+ src/main/webapp/WEB-INF/api-servlet.xml
+
+
+
+
diff --git a/guava18/README.md b/guava18/README.md
new file mode 100644
index 0000000000..8960b4676e
--- /dev/null
+++ b/guava18/README.md
@@ -0,0 +1,13 @@
+=========
+
+## Guava and Hamcrest Cookbooks and Examples
+
+
+### Relevant Articles:
+- [Guava Collections Cookbook](http://www.baeldung.com/guava-collections)
+- [Guava Ordering Cookbook](http://www.baeldung.com/guava-order)
+- [Guava Functional Cookbook](http://www.baeldung.com/guava-functions-predicates)
+
+- [Hamcrest Collections Cookbook](http://www.baeldung.com/hamcrest-collections-arrays)
+
+- [Partition a List in Java](http://www.baeldung.com/java-list-split)
diff --git a/guava18/pom.xml b/guava18/pom.xml
new file mode 100644
index 0000000000..21f4697a73
--- /dev/null
+++ b/guava18/pom.xml
@@ -0,0 +1,41 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ guava
+ 1.0-SNAPSHOT
+
+
+
+ com.google.guava
+ guava
+ 18.0
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
+
+ maven-compiler-plugin
+ 3.3
+
+ true
+ true
+ 1.8
+ 1.8
+ UTF-8
+ true
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/guava18/src/main/java/com/baeldung/guava/entity/Administrator.java b/guava18/src/main/java/com/baeldung/guava/entity/Administrator.java
new file mode 100644
index 0000000000..f9447ea44d
--- /dev/null
+++ b/guava18/src/main/java/com/baeldung/guava/entity/Administrator.java
@@ -0,0 +1,18 @@
+package com.baeldung.guava.entity;
+
+import com.google.common.base.MoreObjects;
+
+public class Administrator extends User{
+ public Administrator(long id, String name, int age) {
+ super(id, name, age);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("id", getId())
+ .add("name", getName())
+ .add("age", getAge())
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/guava18/src/main/java/com/baeldung/guava/entity/Player.java b/guava18/src/main/java/com/baeldung/guava/entity/Player.java
new file mode 100644
index 0000000000..f460fa9f00
--- /dev/null
+++ b/guava18/src/main/java/com/baeldung/guava/entity/Player.java
@@ -0,0 +1,8 @@
+package com.baeldung.guava.entity;
+
+public class Player extends User{
+ public Player(long id, String name, int age) {
+ super(id, name, age);
+ }
+
+}
diff --git a/guava18/src/main/java/com/baeldung/guava/entity/User.java b/guava18/src/main/java/com/baeldung/guava/entity/User.java
new file mode 100644
index 0000000000..be673edb10
--- /dev/null
+++ b/guava18/src/main/java/com/baeldung/guava/entity/User.java
@@ -0,0 +1,36 @@
+package com.baeldung.guava.entity;
+
+import com.google.common.base.MoreObjects;
+
+public class User{
+ private long id;
+ private String name;
+ private int age;
+
+ public User(long id, String name, int age) {
+ this.id = id;
+ this.name = name;
+ this.age = age;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(User.class)
+ .add("id", id)
+ .add("name", name)
+ .add("age", age)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/guava18/src/test/java/com/baeldung/guava/GuavaTest.java b/guava18/src/test/java/com/baeldung/guava/GuavaTest.java
new file mode 100644
index 0000000000..5d1d1c074a
--- /dev/null
+++ b/guava18/src/test/java/com/baeldung/guava/GuavaTest.java
@@ -0,0 +1,177 @@
+import com.baeldung.guava.entity.Administrator;
+import com.baeldung.guava.entity.Player;
+import com.baeldung.guava.entity.User;
+import com.google.common.base.Functions;
+import com.google.common.base.Joiner;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.hash.HashCode;
+import com.google.common.hash.Hashing;
+import com.google.common.net.InetAddresses;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+
+public class GuavaTest {
+
+ private static final int ADULT_AGE = 18;
+
+ @Test
+ public void whenToString_shouldIncludeAllFields() throws Exception {
+ User user = new User(12L, "John Doe", 25);
+
+ Assert.assertThat(user.toString(), equalTo("User{id=12, name=John Doe, age=25}"));
+ }
+
+ @Test
+ public void whenPlayerToString_shouldCallParentToString() throws Exception {
+ User user = new Player(12L, "John Doe", 25);
+
+ Assert.assertThat(user.toString(), equalTo("User{id=12, name=John Doe, age=25}"));
+ }
+
+ @Test
+ public void whenAdministratorToString_shouldExecuteAdministratorToString() throws Exception {
+ User user = new Administrator(12L, "John Doe", 25);
+
+ Assert.assertThat(user.toString(), equalTo("Administrator{id=12, name=John Doe, age=25}"));
+ }
+
+ @Test
+ public void whenFilteringByAge_shouldFilterOnlyAdultUsers() throws Exception {
+ List users = new ArrayList<>();
+ users.add(new User(1L, "John", 45));
+ users.add(new User(2L, "Michael", 27));
+ users.add(new User(3L, "Max", 16));
+ users.add(new User(4L, "Bob", 10));
+ users.add(new User(5L, "Bill", 65));
+
+ Predicate byAge = input -> input.getAge() > ADULT_AGE;
+
+ List results = FluentIterable.from(users)
+ .filter(byAge)
+ .transform(Functions.toStringFunction())
+ .toList();
+
+ Assert.assertThat(results.size(), equalTo(3));
+ }
+
+ @Test
+ public void whenCreatingFluentIterableFromArray_shouldContainAllUsers() throws Exception {
+ User[] usersArray = {new User(1L, "John", 45), new User(2L, "Max", 15)} ;
+ FluentIterable users = FluentIterable.of(usersArray);
+
+ Assert.assertThat(users.size(), equalTo(2));
+ }
+
+ @Test
+ public void whenAppendingElementsToFluentIterable_shouldContainAllUsers() throws Exception {
+ User[] usersArray = {new User(1L, "John", 45), new User(2L, "Max", 15)};
+
+ FluentIterable users = FluentIterable.of(usersArray).append(
+ new User(3L, "Bob", 23),
+ new User(4L, "Bill", 17)
+ );
+
+ Assert.assertThat(users.size(), equalTo(4));
+ }
+
+ @Test
+ public void whenAppendingListToFluentIterable_shouldContainAllUsers() throws Exception {
+ User[] usersArray = {new User(1L, "John", 45), new User(2L, "Max", 15)};
+
+ List usersList = new ArrayList<>();
+ usersList.add(new User(3L, "David", 32));
+
+ FluentIterable users = FluentIterable.of(usersArray).append(usersList);
+
+ Assert.assertThat(users.size(), equalTo(3));
+ }
+
+ @Test
+ public void whenJoiningFluentIterableElements_shouldOutputAllUsers() throws Exception {
+ User[] usersArray = {new User(1L, "John", 45), new User(2L, "Max", 15)};
+
+ FluentIterable users = FluentIterable.of(usersArray);
+
+ Assert.assertThat(users.join(Joiner.on("; ")),
+ equalTo("User{id=1, name=John, age=45}; User{id=2, name=Max, age=15}"));
+ }
+
+ @Test
+ public void whenHashingData_shouldReturnCorrectHashCode() throws Exception {
+ int receivedData = 123;
+
+ HashCode hashCode = Hashing.crc32c().hashInt(receivedData);
+ Assert.assertThat(hashCode.toString(), equalTo("495be649"));
+ }
+
+ @Test
+ public void whenDecrementingIpAddress_shouldReturnOneLessIpAddress() throws Exception {
+ InetAddress address = InetAddress.getByName("127.0.0.5");
+ InetAddress decrementedAddress = InetAddresses.decrement(address);
+
+ Assert.assertThat(decrementedAddress.toString(), equalTo("/127.0.0.4"));
+
+ }
+
+ @Test
+ public void whenExecutingRunnableInThread_shouldLogThreadExecution() throws Exception {
+ ConcurrentHashMap threadExecutions = new ConcurrentHashMap<>();
+ Runnable logThreadRun = () -> threadExecutions.put(Thread.currentThread().getName(), true);
+
+ Thread t = new Thread(logThreadRun);
+ t.run();
+
+ Assert.assertTrue(threadExecutions.get("main"));
+ }
+
+ @Test
+ public void whenExecutingRunnableInThreadPool_shouldLogAllThreadsExecutions() throws Exception {
+ ConcurrentHashMap threadExecutions = new ConcurrentHashMap<>();
+
+ Runnable logThreadRun= () -> threadExecutions.put(Thread.currentThread().getName(), true);
+
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ executorService.submit(logThreadRun);
+ executorService.submit(logThreadRun);
+ executorService.shutdown();
+
+ executorService.awaitTermination(100, TimeUnit.MILLISECONDS);
+
+ Assert.assertTrue(threadExecutions.get("pool-1-thread-1"));
+ Assert.assertTrue(threadExecutions.get("pool-1-thread-2"));
+ }
+
+ @Test
+ public void whenExecutingRunnableInDirectExecutor_shouldLogThreadExecution() throws Exception {
+ ConcurrentHashMap threadExecutions = new ConcurrentHashMap<>();
+
+ Runnable logThreadRun= () -> threadExecutions.put(Thread.currentThread().getName(), true);
+
+ Executor executor = MoreExecutors.directExecutor();
+ executor.execute(logThreadRun);
+
+ Assert.assertTrue(threadExecutions.get("main"));
+ }
+
+ @Test
+ public void whenExecutingRunnableInListeningExecutor_shouldLogThreadExecution() throws Exception {
+ ConcurrentHashMap threadExecutions = new ConcurrentHashMap<>();
+
+ Runnable logThreadRun = () -> threadExecutions.put(Thread.currentThread().getName(), true);
+
+ ListeningExecutorService executor = MoreExecutors.newDirectExecutorService();
+ executor.execute(logThreadRun);
+
+ Assert.assertTrue(threadExecutions.get("main"));
+ }
+}
\ No newline at end of file