import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
class Ideone {
public static void main
(String[] args
) { ArrayList<Mobile> mobiles = new ArrayList<>();
mobiles.add(
Mobile.of(
Plan.of("P1", "Plan 1"),
Plan.of("P2", "Plan 2")));
mobiles.add(Mobile.of(
Plan.of("P1", "Plan 1"),
Plan.of("P2", "Plan 2"),
Plan.of("P3", "Plan 3"),
Plan.of("P4", "Plan 4")));
mobiles.add(Mobile.of(
Plan.of("P1", "Plan 1"),
Plan.of("P2", "Plan 2"),
Plan.of("P5", "Plan 5"),
Plan.of("P6", "Plan 6")));
Set<Plan> commonPlans = extractCommonPlans(mobiles);
System.
out.
println(commonPlans
); }
public static Set<Plan> extractCommonPlans(List<Mobile> mobiles) {
if (Objects.isNull(mobiles) || mobiles.isEmpty()) {
}
HashSet<Plan> initialSet = new HashSet<>(mobiles.get(0).getPlans());
return mobiles.stream()
.map(Mobile::getPlans)
.map(HashSet<Plan>::new)
.reduce(initialSet, (plan1, plan2) -> {
plan1.retainAll(plan2);
return plan1;
});
}
}
class Mobile {
private final List<Plan> plans;
private Mobile(List<Plan> plans) {
this.plans = plans;
}
public static Mobile of(Plan... plans) {
return new Mobile
(Arrays.
asList(plans
)); }
public List<Plan> getPlans() {
return plans;
}
}
class Plan {
this.id = id;
this.name = name;
}
return new Plan(id, name);
}
@Override
public boolean equals
(Object thatObject
) { if (this == thatObject) {
return true;
}
if (getClass() != thatObject.getClass()) {
return false;
}
Plan that = (Plan) thatObject;
return Objects.equals(id, that.id)
&& Objects.equals(name, that.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
@Override
return String.
format("Plan{id=\"%s\", name=\"%s\"}", id, name
); }
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwppbXBvcnQgamF2YS51dGlsLlNldDsKCmNsYXNzIElkZW9uZSB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewoJCUFycmF5TGlzdDxNb2JpbGU+IG1vYmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCQltb2JpbGVzLmFkZCgKCQkJTW9iaWxlLm9mKAoJCQkJUGxhbi5vZigiUDEiLCAiUGxhbiAxIiksCgkJCQlQbGFuLm9mKCJQMiIsICJQbGFuIDIiKSkpOwoJCW1vYmlsZXMuYWRkKE1vYmlsZS5vZigKCQkJCVBsYW4ub2YoIlAxIiwgIlBsYW4gMSIpLAoJCQkJUGxhbi5vZigiUDIiLCAiUGxhbiAyIiksCgkJCQlQbGFuLm9mKCJQMyIsICJQbGFuIDMiKSwKCQkJCVBsYW4ub2YoIlA0IiwgIlBsYW4gNCIpKSk7CgkJbW9iaWxlcy5hZGQoTW9iaWxlLm9mKAoJCQkJUGxhbi5vZigiUDEiLCAiUGxhbiAxIiksCgkJCQlQbGFuLm9mKCJQMiIsICJQbGFuIDIiKSwKCQkJCVBsYW4ub2YoIlA1IiwgIlBsYW4gNSIpLAoJCQkJUGxhbi5vZigiUDYiLCAiUGxhbiA2IikpKTsKCQlTZXQ8UGxhbj4gY29tbW9uUGxhbnMgPSBleHRyYWN0Q29tbW9uUGxhbnMobW9iaWxlcyk7CgkJU3lzdGVtLm91dC5wcmludGxuKGNvbW1vblBsYW5zKTsKCX0KCQoJcHVibGljIHN0YXRpYyBTZXQ8UGxhbj4gZXh0cmFjdENvbW1vblBsYW5zKExpc3Q8TW9iaWxlPiBtb2JpbGVzKSB7CgkJaWYgKE9iamVjdHMuaXNOdWxsKG1vYmlsZXMpIHx8IG1vYmlsZXMuaXNFbXB0eSgpKSB7CgkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwoJCX0KCgkJSGFzaFNldDxQbGFuPiBpbml0aWFsU2V0ID0gbmV3IEhhc2hTZXQ8Pihtb2JpbGVzLmdldCgwKS5nZXRQbGFucygpKTsKCQlyZXR1cm4gbW9iaWxlcy5zdHJlYW0oKQoJCQkubWFwKE1vYmlsZTo6Z2V0UGxhbnMpCgkJCS5tYXAoSGFzaFNldDxQbGFuPjo6bmV3KQoJCQkucmVkdWNlKGluaXRpYWxTZXQsIChwbGFuMSwgcGxhbjIpIC0+IHsgCgkJCQlwbGFuMS5yZXRhaW5BbGwocGxhbjIpOwoJCQkJcmV0dXJuIHBsYW4xOwoJCQl9KTsKCX0KfQoKY2xhc3MgTW9iaWxlIHsKICAgIHByaXZhdGUgZmluYWwgTGlzdDxQbGFuPiBwbGFuczsKICAgIAogICAgcHJpdmF0ZSBNb2JpbGUoTGlzdDxQbGFuPiBwbGFucykgewogICAgCXRoaXMucGxhbnMgPSBwbGFuczsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBNb2JpbGUgb2YoUGxhbi4uLiBwbGFucykgewogICAgCXJldHVybiBuZXcgTW9iaWxlKEFycmF5cy5hc0xpc3QocGxhbnMpKTsKICAgIH0KCiAgICBwdWJsaWMgTGlzdDxQbGFuPiBnZXRQbGFucygpIHsKICAgIAlyZXR1cm4gcGxhbnM7CiAgICB9Cn0KCmNsYXNzIFBsYW4gewogICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CiAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwogICAgCiAgICBwcml2YXRlIFBsYW4oU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewogICAgCXRoaXMuaWQgPSBpZDsKICAgIAl0aGlzLm5hbWUgPSBuYW1lOwogICAgfQogICAgCiAgICBwdWJsaWMgc3RhdGljIFBsYW4gb2YoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewogICAgCXJldHVybiBuZXcgUGxhbihpZCwgbmFtZSk7CiAgICB9CiAgICAKICAgIEBPdmVycmlkZSAKICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdE9iamVjdCkgewogICAgCWlmICh0aGlzID09IHRoYXRPYmplY3QpIHsKICAgIAkJcmV0dXJuIHRydWU7CiAgICAJfQogICAgCWlmIChnZXRDbGFzcygpICE9IHRoYXRPYmplY3QuZ2V0Q2xhc3MoKSkgewogICAgCQlyZXR1cm4gZmFsc2U7CiAgICAJfQogICAgCVBsYW4gdGhhdCA9IChQbGFuKSB0aGF0T2JqZWN0OwogICAgCXJldHVybiBPYmplY3RzLmVxdWFscyhpZCwgdGhhdC5pZCkgCiAgICAJCQkmJiBPYmplY3RzLmVxdWFscyhuYW1lLCB0aGF0Lm5hbWUpOwogICAgfQogICAgCiAgICBAT3ZlcnJpZGUgCiAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgCXJldHVybiBPYmplY3RzLmhhc2goaWQsIG5hbWUpOwogICAgfQogICAgCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAJcmV0dXJuIFN0cmluZy5mb3JtYXQoIlBsYW57aWQ9XCIlc1wiLCBuYW1lPVwiJXNcIn0iLCBpZCwgbmFtZSk7CiAgICB9Cn0=