I have two classes:
JavaScript
x
class SampleClass {
private String testString;
private List<Label> labels;
}
JavaScript
class Label {
private String labelName;
private String labelValue;
}
I have a List<SampleClass> sampleClassList
. I need to find the find element in the list which has a particular labelName
and labelValue
using Java 8.
If I need to get the SampleClass
object based on testString
I would do,
JavaScript
Optional<SampleClass> sampleClass = sampleClassList.stream().filter(entry -> entry.getTestString().equals("some_value").findFirst();
Now that the filtering involves Label
class, I am unable to figure out how to do that. I have tried something like,
JavaScript
Optional<SampleClass> sampleClass = sampleClassList.stream().filter(entry ->
entry.getLabels().stream().filter(label ->
label.getName().equals("some_name") &&
label.getValue().equals("some_value")).findFirst()).findFirst();
for which I get Bad return type in lambda expression: Optional<Label> cannot be converted to boolean
. How would I go about making this change?
I could make it work by using contains()
method
JavaScript
final Optional<SampleClass> sampleClass = sampleClassList.stream()
.filter(entry -> entry.getLabels()
.contains(new Label().withLabelName("some_name").withLabelValue("some_value")))
.findFirst();
but would like to know if I can still use stream()
to make this happen.
Advertisement
Answer
How about this? Instead of the suggested findFirst().isPresent()
you can just use anyMatch()
JavaScript
public class Label {
private String name;
private String value;
public Label(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return "Label{" + "name='" + name + ''' + ", value='" + value + ''' + '}';
}
}
JavaScript
class SampleClass {
private String testString;
private List<Label> labels;
public SampleClass(String testString, List<Label> labels) {
this.testString = testString;
this.labels = labels;
}
public List<Label> getLabels() {
return labels;
}
@Override
public String toString() {
return "SampleClass{" + "testString='" + testString + ''' + ", labels=" + labels + '}';
}
}
JavaScript
import java.util.List;
import java.util.Optional;
class Scratch {
public static void main(String[] args) {
List<SampleClass> sampleClassList = List.of(
new SampleClass("111", List.of(new Label("one", "one value"), new Label("two", "two value"))),
new SampleClass("222", List.of(new Label("one", "one value"), new Label("two", "two value"))),
new SampleClass("333", List.of(new Label("some_name", "some_value"), new Label("two", "two value")))
);
Optional<SampleClass> sampleClass = sampleClassList.stream()
.filter(entry ->
entry.getLabels().stream()
.anyMatch(label ->
label.getName().equals("some_name") &&
label.getValue().equals("some_value")
)
)
.findFirst();
System.out.println(sampleClass.orElse(null));
}
}
This should print:
JavaScript
SampleClass{testString='333', labels=[Label{name='some_name', value='some_value'}, Label{name='two', value='two value'}]}