Merge branch 'master' into master
This commit is contained in:
		
						commit
						54debec690
					
				| @ -1,11 +1,15 @@ | |||||||
| package com.baeldung.temporaladjusters; | package com.baeldung.temporaladjusters; | ||||||
| 
 | 
 | ||||||
|  | import java.text.SimpleDateFormat; | ||||||
|  | 
 | ||||||
| import java.time.DayOfWeek; | import java.time.DayOfWeek; | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
| import java.time.Period; | import java.time.Period; | ||||||
| import java.time.temporal.TemporalAdjuster; | import java.time.temporal.TemporalAdjuster; | ||||||
| import java.time.temporal.TemporalAdjusters; | import java.time.temporal.TemporalAdjusters; | ||||||
| 
 | 
 | ||||||
|  | import java.util.Calendar; | ||||||
|  | 
 | ||||||
| import org.junit.Assert; | import org.junit.Assert; | ||||||
| import org.junit.Test; | import org.junit.Test; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,9 +4,15 @@ import java.time.DayOfWeek; | |||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
| import java.time.temporal.TemporalAdjusters; | import java.time.temporal.TemporalAdjusters; | ||||||
| 
 | 
 | ||||||
|  | import java.text.SimpleDateFormat; | ||||||
|  | 
 | ||||||
|  | import java.util.Calendar; | ||||||
|  | 
 | ||||||
| import org.junit.Assert; | import org.junit.Assert; | ||||||
| import org.junit.Test; | import org.junit.Test; | ||||||
| 
 | 
 | ||||||
|  | import com.baeldung.temporaladjuster.TemporalAdjusterUtil; | ||||||
|  | 
 | ||||||
| public class TemporalAdjustersTest { | public class TemporalAdjustersTest { | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|  | |||||||
| @ -3,11 +3,11 @@ package org.baeldung.guava; | |||||||
| public class CustomEvent { | public class CustomEvent { | ||||||
|     private String action; |     private String action; | ||||||
| 
 | 
 | ||||||
|     public CustomEvent(String action) { |     CustomEvent(String action) { | ||||||
|         this.action = action; |         this.action = action; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public String getAction() { |     String getAction() { | ||||||
|         return action; |         return action; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -28,11 +28,11 @@ public class EventListener { | |||||||
|         eventsHandled++; |         eventsHandled++; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public int getEventsHandled() { |     int getEventsHandled() { | ||||||
|         return eventsHandled; |         return eventsHandled; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void resetEventsHandled() { |     void resetEventsHandled() { | ||||||
|         eventsHandled = 0; |         eventsHandled = 0; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										54
									
								
								guava/src/test/java/org/baeldung/guava/BloomFilterTest.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								guava/src/test/java/org/baeldung/guava/BloomFilterTest.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | package org.baeldung.guava; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import com.google.common.hash.BloomFilter; | ||||||
|  | import com.google.common.hash.Funnels; | ||||||
|  | import org.junit.Test; | ||||||
|  | 
 | ||||||
|  | import java.util.stream.IntStream; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | public class BloomFilterTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenBloomFilter_whenAddNStringsToIt_thenShouldNotReturnAnyFalsePositive() { | ||||||
|  |         //when | ||||||
|  |         BloomFilter<Integer> filter = BloomFilter.create( | ||||||
|  |                 Funnels.integerFunnel(), | ||||||
|  |                 500, | ||||||
|  |                 0.01); | ||||||
|  | 
 | ||||||
|  |         //when | ||||||
|  |         filter.put(1); | ||||||
|  |         filter.put(2); | ||||||
|  |         filter.put(3); | ||||||
|  | 
 | ||||||
|  |         //then | ||||||
|  |         // the probability that it returns true, but is actually false is 1% | ||||||
|  |         assertThat(filter.mightContain(1)).isTrue(); | ||||||
|  |         assertThat(filter.mightContain(2)).isTrue(); | ||||||
|  |         assertThat(filter.mightContain(3)).isTrue(); | ||||||
|  | 
 | ||||||
|  |         assertThat(filter.mightContain(100)).isFalse(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenBloomFilter_whenAddNStringsToItMoreThanDefinedExpectedInsertions_thenItWillReturnTrueForAlmostAllElements() { | ||||||
|  |         //when | ||||||
|  |         BloomFilter<Integer> filter = BloomFilter.create( | ||||||
|  |                 Funnels.integerFunnel(), | ||||||
|  |                 5, | ||||||
|  |                 0.01); | ||||||
|  | 
 | ||||||
|  |         //when | ||||||
|  |         IntStream.range(0, 100_000).forEach(filter::put); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         //then | ||||||
|  |         assertThat(filter.mightContain(1)).isTrue(); | ||||||
|  |         assertThat(filter.mightContain(2)).isTrue(); | ||||||
|  |         assertThat(filter.mightContain(3)).isTrue(); | ||||||
|  |         assertThat(filter.mightContain(1_000_000)).isTrue(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,82 @@ | |||||||
|  | package org.baeldung.guava; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import com.google.common.util.concurrent.RateLimiter; | ||||||
|  | import org.junit.Test; | ||||||
|  | 
 | ||||||
|  | import java.time.ZonedDateTime; | ||||||
|  | import java.util.concurrent.TimeUnit; | ||||||
|  | import java.util.stream.IntStream; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | public class RateLimiterLongRunningUnitTest { | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenLimitedResource_whenUseRateLimiter_thenShouldLimitPermits() { | ||||||
|  |         //given | ||||||
|  |         RateLimiter rateLimiter = RateLimiter.create(100); | ||||||
|  | 
 | ||||||
|  |         //when | ||||||
|  |         long startTime = ZonedDateTime.now().getSecond(); | ||||||
|  |         IntStream.range(0, 1000).forEach(i -> { | ||||||
|  |             rateLimiter.acquire(); | ||||||
|  |             doSomeLimitedOperation(); | ||||||
|  |         }); | ||||||
|  |         long elapsedTimeSeconds = ZonedDateTime.now().getSecond() - startTime; | ||||||
|  | 
 | ||||||
|  |         //then | ||||||
|  |         assertThat(elapsedTimeSeconds >= 10); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenLimitedResource_whenRequestTwice_thenShouldPermitWithoutBlocking() { | ||||||
|  |         //given | ||||||
|  |         RateLimiter rateLimiter = RateLimiter.create(2); | ||||||
|  | 
 | ||||||
|  |         //when | ||||||
|  |         long startTime = ZonedDateTime.now().getSecond(); | ||||||
|  |         rateLimiter.acquire(1); | ||||||
|  |         doSomeLimitedOperation(); | ||||||
|  |         rateLimiter.acquire(1); | ||||||
|  |         doSomeLimitedOperation(); | ||||||
|  |         long elapsedTimeSeconds = ZonedDateTime.now().getSecond() - startTime; | ||||||
|  | 
 | ||||||
|  |         //then | ||||||
|  |         assertThat(elapsedTimeSeconds <= 1); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenLimitedResource_whenRequestOnce_thenShouldPermitWithoutBlocking() { | ||||||
|  |         //given | ||||||
|  |         RateLimiter rateLimiter = RateLimiter.create(100); | ||||||
|  | 
 | ||||||
|  |         //when | ||||||
|  |         long startTime = ZonedDateTime.now().getSecond(); | ||||||
|  |         rateLimiter.acquire(100); | ||||||
|  |         doSomeLimitedOperation(); | ||||||
|  |         long elapsedTimeSeconds = ZonedDateTime.now().getSecond() - startTime; | ||||||
|  | 
 | ||||||
|  |         //then | ||||||
|  |         assertThat(elapsedTimeSeconds <= 1); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void givenLimitedResource_whenTryAcquire_shouldNotBlockIndefinitely() { | ||||||
|  |         //given | ||||||
|  |         RateLimiter rateLimiter = RateLimiter.create(1); | ||||||
|  | 
 | ||||||
|  |         //when | ||||||
|  |         rateLimiter.acquire(); | ||||||
|  |         boolean result = rateLimiter.tryAcquire(2, 10, TimeUnit.MILLISECONDS); | ||||||
|  | 
 | ||||||
|  |         //then | ||||||
|  |         assertThat(result).isFalse(); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void doSomeLimitedOperation() { | ||||||
|  |         //some computing | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -349,6 +349,12 @@ | |||||||
|             <artifactId>java-lsh</artifactId> |             <artifactId>java-lsh</artifactId> | ||||||
|             <version>${java-lsh.version}</version> |             <version>${java-lsh.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |         <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.google.guava</groupId> | ||||||
|  |             <artifactId>guava</artifactId> | ||||||
|  |             <version>21.0</version> | ||||||
|  |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>au.com.dius</groupId> |             <groupId>au.com.dius</groupId> | ||||||
|             <artifactId>pact-jvm-consumer-junit_2.11</artifactId> |             <artifactId>pact-jvm-consumer-junit_2.11</artifactId> | ||||||
|  | |||||||
| @ -8,25 +8,23 @@ public class AsyncService { | |||||||
|     private final int DELAY = 1000; |     private final int DELAY = 1000; | ||||||
|     private final int INIT_DELAY = 2000; |     private final int INIT_DELAY = 2000; | ||||||
| 
 | 
 | ||||||
|     private AtomicLong value = new AtomicLong(0); |     private final AtomicLong value = new AtomicLong(0); | ||||||
|     private Executor executor = Executors.newFixedThreadPool(4); |     private final Executor executor = Executors.newFixedThreadPool(4); | ||||||
|     private volatile boolean initialized = false; |     private volatile boolean initialized = false; | ||||||
| 
 | 
 | ||||||
|     public void initialize() { |     void initialize() { | ||||||
|         executor.execute(() -> { |         executor.execute(() -> { | ||||||
|             sleep(INIT_DELAY); |             sleep(INIT_DELAY); | ||||||
|             initialized = true; |             initialized = true; | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public boolean isInitialized() { |     boolean isInitialized() { | ||||||
|         return initialized; |         return initialized; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void addValue(long val) { |     void addValue(long val) { | ||||||
|         if (!isInitialized()) { |         throwIfNotInitialized(); | ||||||
|             throw new IllegalStateException("Service is not initialized"); |  | ||||||
|         } |  | ||||||
|         executor.execute(() -> { |         executor.execute(() -> { | ||||||
|             sleep(DELAY); |             sleep(DELAY); | ||||||
|             value.addAndGet(val); |             value.addAndGet(val); | ||||||
| @ -34,9 +32,7 @@ public class AsyncService { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public long getValue() { |     public long getValue() { | ||||||
|         if (!isInitialized()) { |         throwIfNotInitialized(); | ||||||
|             throw new IllegalStateException("Service is not initialized"); |  | ||||||
|         } |  | ||||||
|         return value.longValue(); |         return value.longValue(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -47,4 +43,10 @@ public class AsyncService { | |||||||
|             e.printStackTrace(); |             e.printStackTrace(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     private void throwIfNotInitialized() { | ||||||
|  |         if (!initialized) { | ||||||
|  |             throw new IllegalStateException("Service is not initialized"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,40 @@ | |||||||
|  | package com.baeldung.zip; | ||||||
|  | 
 | ||||||
|  | import com.google.common.collect.Streams; | ||||||
|  | import org.jooq.lambda.Seq; | ||||||
|  | 
 | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.stream.IntStream; | ||||||
|  | 
 | ||||||
|  | public class ZipCollectionExample { | ||||||
|  |     static List<String> names = Arrays.asList("John", "Jane", "Jack", "Dennis"); | ||||||
|  | 
 | ||||||
|  |     static List<Integer> ages = Arrays.asList(24, 25, 27); | ||||||
|  | 
 | ||||||
|  |     public static void main(String[] args) { | ||||||
|  |         //      Using Streams API from Guava 21 | ||||||
|  |         Streams | ||||||
|  |           .zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age) | ||||||
|  |           .forEach(System.out::println); | ||||||
|  | 
 | ||||||
|  |         //        Using native Java 8 Int Stream | ||||||
|  |         IntStream | ||||||
|  |           .range(0, Math.min(names.size(), ages.size())) | ||||||
|  |           .mapToObj(i -> names.get(i) + ":" + ages.get(i)) | ||||||
|  |           .forEach(System.out::println); | ||||||
|  | 
 | ||||||
|  |         //      Using jOOL | ||||||
|  |         Seq | ||||||
|  |           .of("John", "Jane", "Dennis") | ||||||
|  |           .zip(Seq.of(24, 25, 27)); | ||||||
|  | 
 | ||||||
|  |         Seq | ||||||
|  |           .of("John", "Jane", "Dennis") | ||||||
|  |           .zip(Seq.of(24, 25, 27), (x, y) -> x + ":" + y); | ||||||
|  | 
 | ||||||
|  |         Seq | ||||||
|  |           .of("a", "b", "c") | ||||||
|  |           .zipWithIndex(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -1,19 +1,20 @@ | |||||||
| package com.baeldung.awaitility; | package com.baeldung.awaitility; | ||||||
| 
 | 
 | ||||||
|  | import org.awaitility.Awaitility; | ||||||
|  | import org.awaitility.Duration; | ||||||
|  | import org.junit.Before; | ||||||
|  | import org.junit.BeforeClass; | ||||||
|  | import org.junit.Test; | ||||||
|  | 
 | ||||||
|  | import java.util.concurrent.Callable; | ||||||
|  | import java.util.concurrent.TimeUnit; | ||||||
|  | 
 | ||||||
| import static org.awaitility.Awaitility.await; | import static org.awaitility.Awaitility.await; | ||||||
| import static org.awaitility.Awaitility.fieldIn; | import static org.awaitility.Awaitility.fieldIn; | ||||||
| import static org.awaitility.Awaitility.given; | import static org.awaitility.Awaitility.given; | ||||||
| import static org.awaitility.proxy.AwaitilityClassProxy.to; | import static org.awaitility.proxy.AwaitilityClassProxy.to; | ||||||
| import static org.hamcrest.Matchers.equalTo; | import static org.hamcrest.Matchers.equalTo; | ||||||
| 
 | 
 | ||||||
| import java.util.concurrent.Callable; |  | ||||||
| import java.util.concurrent.TimeUnit; |  | ||||||
| 
 |  | ||||||
| import org.awaitility.Awaitility; |  | ||||||
| import org.awaitility.Duration; |  | ||||||
| import org.junit.Before; |  | ||||||
| import org.junit.Test; |  | ||||||
| 
 |  | ||||||
| public class AsyncServiceUnitTest { | public class AsyncServiceUnitTest { | ||||||
|     private AsyncService asyncService; |     private AsyncService asyncService; | ||||||
| 
 | 
 | ||||||
| @ -25,18 +26,18 @@ public class AsyncServiceUnitTest { | |||||||
|     @Test |     @Test | ||||||
|     public void givenAsyncService_whenInitialize_thenInitOccurs1() { |     public void givenAsyncService_whenInitialize_thenInitOccurs1() { | ||||||
|         asyncService.initialize(); |         asyncService.initialize(); | ||||||
|         Callable<Boolean> isInitialized = () -> asyncService.isInitialized(); |         Callable<Boolean> isInitialized = asyncService::isInitialized; | ||||||
|         await().until(isInitialized); |         await().until(isInitialized); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     public void givenAsyncService_whenInitialize_thenInitOccurs2() { |     public void givenAsyncService_whenInitialize_thenInitOccurs2() { | ||||||
|         asyncService.initialize(); |         asyncService.initialize(); | ||||||
|         Callable<Boolean> isInitialized = () -> asyncService.isInitialized(); |         Callable<Boolean> isInitialized = asyncService::isInitialized; | ||||||
|         await().atLeast(Duration.ONE_HUNDRED_MILLISECONDS) |         await().atLeast(Duration.ONE_HUNDRED_MILLISECONDS) | ||||||
|                 .atMost(Duration.FIVE_SECONDS) |           .atMost(Duration.FIVE_SECONDS) | ||||||
|                 .with().pollInterval(Duration.ONE_HUNDRED_MILLISECONDS) |           .with().pollInterval(Duration.ONE_HUNDRED_MILLISECONDS) | ||||||
|                 .until(isInitialized); |           .until(isInitialized); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
| @ -46,7 +47,7 @@ public class AsyncServiceUnitTest { | |||||||
|         Awaitility.setDefaultTimeout(Duration.ONE_MINUTE); |         Awaitility.setDefaultTimeout(Duration.ONE_MINUTE); | ||||||
| 
 | 
 | ||||||
|         asyncService.initialize(); |         asyncService.initialize(); | ||||||
|         await().until(() -> asyncService.isInitialized()); |         await().until(asyncService::isInitialized); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
| @ -59,14 +60,14 @@ public class AsyncServiceUnitTest { | |||||||
|     public void givenAsyncService_whenInitialize_thenInitOccurs3() { |     public void givenAsyncService_whenInitialize_thenInitOccurs3() { | ||||||
|         asyncService.initialize(); |         asyncService.initialize(); | ||||||
|         await().until(fieldIn(asyncService) |         await().until(fieldIn(asyncService) | ||||||
|                 .ofType(boolean.class) |           .ofType(boolean.class) | ||||||
|                 .andWithName("initialized"), equalTo(true)); |           .andWithName("initialized"), equalTo(true)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     public void givenValue_whenAddValue_thenValueAdded() { |     public void givenValue_whenAddValue_thenValueAdded() { | ||||||
|         asyncService.initialize(); |         asyncService.initialize(); | ||||||
|         await().until(() -> asyncService.isInitialized()); |         await().until(asyncService::isInitialized); | ||||||
|         long value = 5; |         long value = 5; | ||||||
|         asyncService.addValue(value); |         asyncService.addValue(value); | ||||||
|         await().until(asyncService::getValue, equalTo(value)); |         await().until(asyncService::getValue, equalTo(value)); | ||||||
| @ -76,9 +77,9 @@ public class AsyncServiceUnitTest { | |||||||
|     public void givenAsyncService_whenGetValue_thenExceptionIgnored() { |     public void givenAsyncService_whenGetValue_thenExceptionIgnored() { | ||||||
|         asyncService.initialize(); |         asyncService.initialize(); | ||||||
|         given().ignoreException(IllegalStateException.class) |         given().ignoreException(IllegalStateException.class) | ||||||
|                 .await() |           .await() | ||||||
|                 .atMost(Duration.FIVE_SECONDS) |           .atMost(Duration.FIVE_SECONDS) | ||||||
|                 .atLeast(Duration.FIVE_HUNDRED_MILLISECONDS) |           .atLeast(Duration.FIVE_HUNDRED_MILLISECONDS) | ||||||
|                 .until(asyncService::getValue, equalTo(0L)); |           .until(asyncService::getValue, equalTo(0L)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -54,8 +54,10 @@ public class CollectionUtilsGuideTest { | |||||||
|      |      | ||||||
|     @Test |     @Test | ||||||
|     public void givenListOfCustomers_whenTransformed_thenListOfAddress() { |     public void givenListOfCustomers_whenTransformed_thenListOfAddress() { | ||||||
|         Collection<Address> addressCol = CollectionUtils.collect(list1, customer -> { |         Collection<Address> addressCol = CollectionUtils.collect(list1, new Transformer<Customer, Address>() { | ||||||
|             return new Address(customer.getLocality(), customer.getCity(), customer.getZip()); |             public Address transform(Customer customer) { | ||||||
|  |                 return new Address(customer.getLocality(), customer.getCity(), customer.getZip()); | ||||||
|  |             } | ||||||
|         }); |         }); | ||||||
|          |          | ||||||
|         List<Address> addressList = new ArrayList<>(addressCol); |         List<Address> addressList = new ArrayList<>(addressCol); | ||||||
| @ -66,7 +68,11 @@ public class CollectionUtilsGuideTest { | |||||||
|     @Test |     @Test | ||||||
|     public void givenCustomerList_whenFiltered_thenCorrectSize() { |     public void givenCustomerList_whenFiltered_thenCorrectSize() { | ||||||
| 
 | 
 | ||||||
|         boolean isModified = CollectionUtils.filter(linkedList1, customer -> Arrays.asList("Daniel","Kyle").contains(customer.getName())); |         boolean isModified = CollectionUtils.filter(linkedList1, new Predicate<Customer>() { | ||||||
|  |             public boolean evaluate(Customer customer) { | ||||||
|  |                 return Arrays.asList("Daniel","Kyle").contains(customer.getName()); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
| 
 | 
 | ||||||
|         //filterInverse does the opposite. It removes the element from the list if the Predicate returns true |         //filterInverse does the opposite. It removes the element from the list if the Predicate returns true | ||||||
|         //select and selectRejected work the same way except that they do not remove elements from the given collection and return a new collection  |         //select and selectRejected work the same way except that they do not remove elements from the given collection and return a new collection  | ||||||
|  | |||||||
| @ -0,0 +1,85 @@ | |||||||
|  | package com.baeldung.zip; | ||||||
|  | 
 | ||||||
|  | import com.google.common.collect.Streams; | ||||||
|  | import org.jooq.lambda.Seq; | ||||||
|  | import org.jooq.lambda.tuple.Tuple2; | ||||||
|  | import org.junit.Before; | ||||||
|  | import org.junit.Test; | ||||||
|  | 
 | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import java.util.stream.IntStream; | ||||||
|  | 
 | ||||||
|  | import static org.junit.Assert.assertEquals; | ||||||
|  | 
 | ||||||
|  | public class ZipCollectionTest { | ||||||
|  | 
 | ||||||
|  |     List<String> names; | ||||||
|  |     List<Integer> ages; | ||||||
|  |     List<String> expectedOutput; | ||||||
|  | 
 | ||||||
|  |     @Before | ||||||
|  |     public void setUp() throws Exception { | ||||||
|  |         names = Arrays.asList("John", "Jane", "Jack", "Dennis"); | ||||||
|  |         ages = Arrays.asList(24, 25, 27); | ||||||
|  |         expectedOutput = Arrays.asList("John:24", "Jane:25", "Jack:27"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void zipCollectionUsingGuava21() { | ||||||
|  |         List<String> output = Streams | ||||||
|  |           .zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age) | ||||||
|  |           .collect(Collectors.toList()); | ||||||
|  | 
 | ||||||
|  |         assertEquals(output, expectedOutput); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void zipCollectionUsingIntStream() { | ||||||
|  |         List<String> output = IntStream | ||||||
|  |           .range(0, Math.min(names.size(), ages.size())) | ||||||
|  |           .mapToObj(i -> names.get(i) + ":" + ages.get(i)) | ||||||
|  |           .collect(Collectors.toList()); | ||||||
|  | 
 | ||||||
|  |         assertEquals(output, expectedOutput); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void zipCollectionUsingJool() { | ||||||
|  |         Seq<String> output = Seq | ||||||
|  |           .of("John", "Jane", "Jack") | ||||||
|  |           .zip(Seq.of(24, 25, 27), (x, y) -> x + ":" + y); | ||||||
|  | 
 | ||||||
|  |         assertEquals(output.toList(), expectedOutput); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void zipCollectionUsingJoolTuple() { | ||||||
|  |         Seq<Tuple2<String, Integer>> output = Seq | ||||||
|  |           .of("John", "Jane", "Dennis") | ||||||
|  |           .zip(Seq.of(24, 25, 27)); | ||||||
|  | 
 | ||||||
|  |         Tuple2<String, Integer> element1 = new Tuple2<String, Integer>("John", 24); | ||||||
|  |         Tuple2<String, Integer> element2 = new Tuple2<String, Integer>("Jane", 25); | ||||||
|  |         Tuple2<String, Integer> element3 = new Tuple2<String, Integer>("Dennis", 27); | ||||||
|  | 
 | ||||||
|  |         List<Tuple2> expectedOutput = Arrays.asList(element1, element2, element3); | ||||||
|  |         assertEquals(output.collect(Collectors.toList()), expectedOutput); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void zipCollectionUsingJoolWithIndex() { | ||||||
|  |         Seq<Tuple2<String, Long>> output = Seq | ||||||
|  |           .of("John", "Jane", "Dennis") | ||||||
|  |           .zipWithIndex(); | ||||||
|  | 
 | ||||||
|  |         Tuple2<String, Long> element1 = new Tuple2<>("John", 0L); | ||||||
|  |         Tuple2<String, Long> element2 = new Tuple2<>("Jane", 1L); | ||||||
|  |         Tuple2<String, Long> element3 = new Tuple2<>("Dennis", 2L); | ||||||
|  | 
 | ||||||
|  |         List<Tuple2> expectedOutput = Arrays.asList(element1, element2, element3); | ||||||
|  |         assertEquals(output.collect(Collectors.toList()), expectedOutput); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user