removed usage of interface default methods

master
Stefan Dollase 2016-11-20 23:17:46 +01:00
parent 2226cb7116
commit f34fb54fbb
3 changed files with 29 additions and 34 deletions

View File

@ -1,31 +1,25 @@
package amidst.clazz.real; package amidst.clazz.real;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import amidst.documentation.Immutable; import amidst.documentation.Immutable;
@Immutable @Immutable
@FunctionalInterface public class RealClassDetector {
public interface RealClassDetector { private final Predicate<RealClass> predicate;
public default RealClass firstMatching(List<RealClass> realClasses) {
for (RealClass realClass : realClasses) { public RealClassDetector(Predicate<RealClass> predicate) {
if (detect(realClass)) { this.predicate = predicate;
return realClass;
}
}
return null;
} }
public default List<RealClass> allMatching(List<RealClass> realClasses) { public Optional<RealClass> firstMatching(List<RealClass> realClasses) {
List<RealClass> result = new ArrayList<>(); return realClasses.stream().filter(predicate).findFirst();
for (RealClass realClass : realClasses) {
if (detect(realClass)) {
result.add(realClass);
}
}
return result;
} }
public boolean detect(RealClass realClass); public List<RealClass> allMatching(List<RealClass> realClasses) {
return realClasses.stream().filter(predicate).collect(Collectors.toList());
}
} }

View File

@ -4,7 +4,9 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Predicate;
import amidst.clazz.real.RealClass;
import amidst.clazz.real.RealClassDetector; import amidst.clazz.real.RealClassDetector;
import amidst.clazz.symbolic.declaration.SymbolicClassDeclaration; import amidst.clazz.symbolic.declaration.SymbolicClassDeclaration;
import amidst.clazz.symbolic.declaration.SymbolicConstructorDeclaration; import amidst.clazz.symbolic.declaration.SymbolicConstructorDeclaration;
@ -115,8 +117,8 @@ public class CTBuilder {
this.previous = previous; this.previous = previous;
} }
public CTBuilder ifDetect(RealClassDetector detector) { public CTBuilder ifDetect(Predicate<RealClass> predicate) {
this.detector = detector; this.detector = new RealClassDetector(predicate);
return this; return this;
} }
@ -132,8 +134,8 @@ public class CTBuilder {
if (detector == null) { if (detector == null) {
throw new IllegalStateException("can't declare a symbolic class without calling ifDetect before"); throw new IllegalStateException("can't declare a symbolic class without calling ifDetect before");
} }
CTBuilder.this.declarationBuilder.init(symbolicClassName, isOptional); declarationBuilder.init(symbolicClassName, isOptional);
return CTBuilder.this.declarationBuilder; return declarationBuilder;
} }
public ClassTranslator construct() { public ClassTranslator construct() {

View File

@ -4,6 +4,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Optional;
import amidst.clazz.real.RealClass; import amidst.clazz.real.RealClass;
import amidst.clazz.real.RealClassDetector; import amidst.clazz.real.RealClassDetector;
@ -39,12 +40,10 @@ public class ClassTranslator {
public Map<SymbolicClassDeclaration, String> translate(List<RealClass> realClasses) throws ClassNotFoundException { public Map<SymbolicClassDeclaration, String> translate(List<RealClass> realClasses) throws ClassNotFoundException {
Map<SymbolicClassDeclaration, String> result = new HashMap<>(); Map<SymbolicClassDeclaration, String> result = new HashMap<>();
for (Entry<RealClassDetector, SymbolicClassDeclaration> entry : translations.entrySet()) { for (Entry<RealClassDetector, SymbolicClassDeclaration> entry : translations.entrySet()) {
RealClass firstMatching = entry.getKey().firstMatching(realClasses); addResult(
String realClassName = null; result,
if (firstMatching != null) { entry.getValue(),
realClassName = firstMatching.getRealClassName(); entry.getKey().firstMatching(realClasses).map(RealClass::getRealClassName));
}
addResult(result, entry.getValue(), realClassName);
} }
return result; return result;
} }
@ -52,14 +51,14 @@ public class ClassTranslator {
private void addResult( private void addResult(
Map<SymbolicClassDeclaration, String> result, Map<SymbolicClassDeclaration, String> result,
SymbolicClassDeclaration declaration, SymbolicClassDeclaration declaration,
String realClassName) throws ClassNotFoundException { Optional<String> realClassName) throws ClassNotFoundException {
if (realClassName == null) { if (!realClassName.isPresent()) {
declaration.handleNoMatch(); declaration.handleNoMatch();
} else if (result.containsKey(declaration)) { } else if (result.containsKey(declaration)) {
declaration.handleMultipleMatches(result.get(declaration), realClassName); declaration.handleMultipleMatches(result.get(declaration), realClassName.get());
} else { } else {
declaration.handleMatch(realClassName); declaration.handleMatch(realClassName.get());
result.put(declaration, realClassName); result.put(declaration, realClassName.get());
} }
} }
} }