Core Java

Java 8 Check if Array Contains a Certain Value Example

1. Introduction

An array is a data structure which holds a fixed number of values of a single type. In this example, I will demonstrate how to check if an array contains a certain value in three ways:

  • Convert an array to a Collection and check with the contains method
  • Use Arrays.binarySearch to check when the array is sorted
  • Convert an array to Java 8 Stream and check with anyMatch, filter, or findAny methods

2. Technologies used

The example code in this article was built and run using:

  • Java 1.8.101
  • Maven 3.3.9
  • Eclipse Oxygen
  • JUnit 4.12

3. Maven Project

3.1 Dependency

Add JUnit to the pom.xml.

pom.xml

<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>zheng.jcg.demo</groupId>
	<artifactId>java8-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.3</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

3.2 Sample Data

I will create a SampleData class which has the equals method. This class will be used to form an object array.

SampleData.java

package com.zheng.demo;

public class SampleData {

	private int key;
	private String name;

	public SampleData(int key, String name) {
		super();
		this.key = key;
		this.name = name;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		SampleData other = (SampleData) obj;
		if (key != other.key)
			return false;
		return true;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + key;
		return result;
	}

	@Override
	public String toString() {
		return "SampleData [key=" + key + ", name=" + name + "]";
	}

}

3.3 Check Item from Array with Stream

JDK 8 Stream interface provides three methods that we can use to check an item from an array.

Return type Method Description
Optional<T> findAny() Returns an Optional describing some element of the stream, or an empty Optional if the stream is empty.
Stream<T> filter(Predicate<? super T> predicate) Returns a stream consisting of the elements of this stream that match the given predicate.
boolean anyMatch(Predicate<? super T> predicate) Returns whether any elements of this stream match the provided predicate.

 

In this step, I will create a CheckItemFromArray_Java8 class to demonstrate how to check an item in an array.

CheckItemFromArray_Java8.java

package com.zheng.demo;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;

public class CheckItemFromArray_Java8 {

	public boolean byDoubleStreamAnyMatch(double[] values, double targetValue) {
		return DoubleStream.of(values).anyMatch(x -> x == targetValue);
	}

	public boolean byDoubleStreamAnyMatch_2(double[] values, double targetValue) {
		return DoubleStream.of(values).anyMatch(x -> Double.compare(x, targetValue) == 0);
	}

	public boolean byIntStreamAnyMatch(int[] values, int targetValue) {
		return IntStream.of(values).anyMatch(x -> x == targetValue);
	}

	public boolean byLongStreamAnyMatch(long[] values, long targetValue) {
		return LongStream.of(values).anyMatch(x -> x == targetValue);
	}

	public <T> boolean byStreamAnyMatch(T[] array, T targetValue) {
		return Arrays.stream(array).anyMatch(targetValue::equals);
	}

	public boolean byStreamAnyMatchEquals(String[] checkingArray, String targetValue) {
		return Arrays.stream(checkingArray).anyMatch(targetValue::equals);
	}

	public boolean byStreamAnyMatchEqualsIgnoreCase(String[] checkingArray, String targetValue) {
		return Arrays.stream(checkingArray).anyMatch(targetValue::equalsIgnoreCase);
	}

	public boolean byStreamFilter(String[] checkingArray, String targetValue) {
		List<String> filterData = Arrays.stream(checkingArray).filter(x -> targetValue.equals(x))
				.collect(Collectors.toList());
		return !filterData.isEmpty();
	}

	public boolean byStreamFindAny(int[] values, int targetValue) {
		int found = Arrays.stream(values).filter(x -> targetValue == x).findAny().orElse(-1);
		return found != -1;
	}
	

	public boolean byStreamFindAny(String[] checkingArray, String targetValue) {
		String found = Arrays.stream(checkingArray).filter(x -> targetValue.equals(x)).findAny().orElse(null);
		return found != null;
	}
}

Note: the equality check is different based on the object type.

4. JUnit Tests

4.1 Test Data Provider

I will create a TestDataProvider class for the common data.

TestDataProvider.java

package com.zheng.demo;

public class TestDataProvider {

	public static double[] DOUBLE_ARRAY = new double[] { 1d, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	public static int[] INT_ARRAY = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	public static long[] LONG_ARRAY = new long[] { 1l, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	public static final int NOT_IN_INT_ARRAY = 20;
	public static String[] STRING_ARRAY = new String[] { "AA", "BB", "CC", "DD", "EE" };
	public static final String STRING_NOT_IN_ARRAY = "D";

	public static SampleData[] getSampleDataArray() {
		SampleData[] objects = new SampleData[4];
		objects[0] = new SampleData(1, "Mary");
		objects[1] = new SampleData(2, "Terry");
		objects[2] = new SampleData(3, "Tom");
		objects[3] = new SampleData(4, "John");
		return objects;
	}
}

4.2 Check Item from Array with Arrays

java.util.Arrays class provides binarySearch which finds the specified element using the binary search algorithm.

I will create an ArraysBinarySearchTest class to search an item.

ArraysBinarySearchTest.java

package com.zheng.demo;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.Collections;

import org.junit.Test;

public class ArraysBinarySearchTest {

	@Test
	public void findfrom_sorted_double_Array() {
		for (double item : TestDataProvider.DOUBLE_ARRAY) {
			int foundIndex = Arrays.binarySearch(TestDataProvider.DOUBLE_ARRAY, item);
			assertTrue(foundIndex >= 0);
		}
	}

	@Test
	public void findfrom_sorted_int_Array() {
		for (int item : TestDataProvider.INT_ARRAY) {
			int foundIndex = Arrays.binarySearch(TestDataProvider.INT_ARRAY, item);
			assertTrue(foundIndex >= 0);
		}
	}

	@Test
	public void findfrom_sorted_long_Array() {
		for (long item : TestDataProvider.LONG_ARRAY) {
			int foundIndex = Arrays.binarySearch(TestDataProvider.LONG_ARRAY, item);
			assertTrue(foundIndex >= 0);
		}
	}

	@Test
	public void findfrom_sorted_String_Array() {
		String[] stringArray = TestDataProvider.STRING_ARRAY;
		Collections.sort(Arrays.asList(stringArray));
		int foundIndex = Arrays.binarySearch(stringArray, TestDataProvider.STRING_NOT_IN_ARRAY);
		assertFalse(foundIndex >= 0);

		for (String item : stringArray) {
			foundIndex = Arrays.binarySearch(stringArray, item);
			assertTrue(foundIndex >= 0);
		}
	}

}

4.3 Check Item from Array with Collection

java.util.Collection interface provides contains(Object o) which returns true if this collection contains the specified element.

I will create a CollectionContainsTest class to convert an array into a List or Set and use thecontains method to check if an array contains a certain value.

CollectionContainsTest.java

package com.zheng.demo;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;

public class CollectionContainsTest {

	private String[] stringArray;

	@Before
	public void setup() {
		stringArray = TestDataProvider.STRING_ARRAY;
	}

	@Test
	public void check_byListContains() {
		boolean found = Arrays.asList(stringArray).contains(TestDataProvider.STRING_NOT_IN_ARRAY);
		assertFalse(found);

		for (String item : stringArray) {
			found = Arrays.asList(stringArray).contains(item);
			assertTrue(found);
		}
	}

	@Test
	public void check_bySetContains() {
		Set set = new HashSet(Arrays.asList(stringArray));
		boolean found = set.contains(TestDataProvider.STRING_NOT_IN_ARRAY);
		assertFalse(found);

		for (String item : stringArray) {
			found = set.contains(item);
			assertTrue(found);
		}
	}

}

4.4 Test for CheckItemFromArray_Java8

In this step, I will create CheckItemFromArray_Java8Test to test the methods defined in CheckItemFromArray_Java8.

CheckItemFromArray_Java8Test.java

package com.zheng.demo;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;

import org.junit.Before;
import org.junit.Test;

public class CheckItemFromArray_Java8Test {

	private CheckItemFromArray_Java8 testObject = new CheckItemFromArray_Java8();

	private int[] intValues;
	private long[] longValues;
	private double[] doubleValues;
	private String[] checkingArray;

	@Before
	public void setup() {
		checkingArray = TestDataProvider.STRING_ARRAY;
		intValues = TestDataProvider.INT_ARRAY;
		longValues = TestDataProvider.LONG_ARRAY;
		doubleValues = TestDataProvider.DOUBLE_ARRAY;
	}

	@Test
	public void byStreamAnyMatchEqualsIgnoreCase() {
		boolean found = testObject.byStreamAnyMatchEqualsIgnoreCase(checkingArray,
				TestDataProvider.STRING_NOT_IN_ARRAY);
		assertFalse(found);

		Arrays.stream(checkingArray)
				.forEach(x -> assertTrue(testObject.byStreamAnyMatchEqualsIgnoreCase(checkingArray, x)));
	}

	@Test
	public void byStreamAnyMatchEquals() {
		boolean found = testObject.byStreamAnyMatchEquals(checkingArray, TestDataProvider.STRING_NOT_IN_ARRAY);
		assertFalse(found);

		Arrays.stream(checkingArray).forEach(x -> assertTrue(testObject.byStreamAnyMatchEquals(checkingArray, x)));
	}

	@Test
	public void byStreamFilter() {
		boolean found = testObject.byStreamFilter(checkingArray, TestDataProvider.STRING_NOT_IN_ARRAY);
		assertFalse(found);

		Arrays.stream(checkingArray).forEach(x -> assertTrue(testObject.byStreamFilter(checkingArray, x)));
	}

	@Test
	public void byStreamFindAny() {
		boolean found = testObject.byStreamFindAny(checkingArray, TestDataProvider.STRING_NOT_IN_ARRAY);
		assertFalse(found);

		Arrays.stream(checkingArray).forEach(x -> assertTrue(testObject.byStreamFindAny(checkingArray, x)));
	}

	@Test
	public void test_byAnyMatch() {
		SampleData[] objects = TestDataProvider.getSampleDataArray();

		boolean found = testObject.byStreamAnyMatch(objects, new SampleData(1, "Mary"));
		assertTrue(found);

		found = testObject.byStreamAnyMatch(objects, new SampleData(6, "Mary"));
		assertFalse(found);
	}

	@Test
	public void checkInt_byStreamAnyMatch() {
		IntStream.of(intValues).forEach(x -> assertTrue(testObject.byIntStreamAnyMatch(intValues, x)));
		boolean found = testObject.byIntStreamAnyMatch(intValues, TestDataProvider.NOT_IN_INT_ARRAY);
		assertFalse(found);
	}

	@Test
	public void checkLong_byStreamAnyMatch() {
		boolean found = testObject.byLongStreamAnyMatch(longValues, TestDataProvider.NOT_IN_INT_ARRAY);
		assertFalse(found);

		LongStream.of(longValues).forEach(x -> assertTrue(testObject.byLongStreamAnyMatch(longValues, x)));
	}

	@Test
	public void checkDouble_byStreamAnyMatch() {
		boolean found = testObject.byDoubleStreamAnyMatch(doubleValues, TestDataProvider.NOT_IN_INT_ARRAY);
		assertFalse(found);

		DoubleStream.of(doubleValues).forEach(x -> assertTrue(testObject.byDoubleStreamAnyMatch(doubleValues, x)));
	}

	@Test
	public void checkDouble_byStreamAnyMatch_2() {
		boolean found = testObject.byDoubleStreamAnyMatch_2(doubleValues, TestDataProvider.NOT_IN_INT_ARRAY);
		assertFalse(found);

		DoubleStream.of(doubleValues).forEach(x -> assertTrue(testObject.byDoubleStreamAnyMatch(doubleValues, x)));
	}

	@Test
	public void byStreamFindAny_withInt() {
		boolean found = testObject.byStreamFindAny(intValues, TestDataProvider.NOT_IN_INT_ARRAY);
		assertFalse(found);

		IntStream.of(intValues).forEach(x -> assertTrue(testObject.byStreamFindAny(intValues, x)));

	}

}

5. Demo

Execute mvn clean install and capture the output:

Tests Output

C:\gitworkspace\java8-demo>mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< zheng.jcg.demo:java8-demo >----------------------
[INFO] Building java8-demo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ java8-demo ---
[INFO] Deleting C:\gitworkspace\java8-demo\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ java8-demo ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ java8-demo ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 2 source files to C:\gitworkspace\java8-demo\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ java8-demo ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.3:testCompile (default-testCompile) @ java8-demo ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 4 source files to C:\gitworkspace\java8-demo\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ java8-demo ---
[INFO] Surefire report directory: C:\gitworkspace\java8-demo\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.zheng.demo.ArraysBinarySearchTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.058 sec
Running com.zheng.demo.CheckItemFromArray_Java8Test
Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.051 sec
Running com.zheng.demo.CollectionContainsTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

Results :

Tests run: 16, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java8-demo ---
[INFO] Building jar: C:\gitworkspace\java8-demo\target\java8-demo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ java8-demo ---
[INFO] Installing C:\gitworkspace\java8-demo\target\java8-demo-0.0.1-SNAPSHOT.jar to C:\repo\zheng\jcg\demojava8-demo\0.0.1-SNAPSHOT\java8-demo-0.0.1-SNAPSHOT.jar
[INFO] Installing C:\gitworkspace\java8-demo\pom.xml to C:\repo\zheng\jcg\demo\java8-demo\0.0.1-SNAPSHOT\java8-demo-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.727 s
[INFO] Finished at: 2018-11-08T09:50:35-06:00
[INFO] ------------------------------------------------------------------------

C:\gitworkspace\java8-demo>

6. Summary

In this example, we demonstrated how to check if an array contains a certain value using Java 8 Stream interface as well as the Collection’s contains method.

7. Download the Source Code

This example consists of a Maven project to check if an array contains a certain value.

Download
You can download the full source code of this example here: Java 8 Check if Array Contains a Certain Value Example

Mary Zheng

Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button