Pattern matching for nested List with additional size constraints
Swaranga Sarma
sarma.swaranga at gmail.com
Mon Jan 25 22:58:59 UTC 2021
Hello, I was going through some code in my work today and came across
several similar looking cases and was wondering if pattern matching would
be a more concise and cleaner way to pxress the logic.
Here is a succinct class hierarchy that illustrates the example:
class Profile {
Rules rules;
}
class Rules {
List<Rule> ruleList;
}
class Rule {
DynamicConfig dynamicConfig;
StaticConfig staticConfig;
}
class DynamicConfig {
SomeProperty property;
}
class StaticConfig {
SomeOtherProperty property;
}
With the above classes, we have a method "isDynamicConfigProfile" that
determines if the Profile is a DynamicConfig profile. A Profile is
considered dynamic if it contains a Rule with a non-null DynamicConfig
member; also ALL the Rules of a profile can only contain one type either
Dynamic or Static so checking just the first element in the ruleList is
sufficient.
The current code is implemented as:
boolean isDynamicProfile (Profile profile) {
return profile.rules() != null &&
profile.rules().ruleList() != null &&
profile.rules().ruleList().size() > 0 &&
profile.rules().rulesList().get(0).dynamicConfig() != null;
}
Is the above method something that could be expressed with a switch and
pattern matching; assuming these are converted to Record classes? Something
like:
boolean isDynamicProfile (Profile profile) {
return switch(profile) {
case Profile(Rules(Rule(DynamicConfig dc), Rule(var r2)...
remainingElements)) -> true;
default-> false;
}
}
Is it even a valid usage of patterns? I think even the List interface would
need to support pattern matching in this case.
Regards
Swaranga
More information about the amber-dev
mailing list