在多个 if 语句中调用正则表达式检查方法时使用哪种模式或方法?
Which pattern or method to use when calling a regex check method in multiple if statements?
我在 class 中创建了一个工厂模式。
在这个 class 中,我注入了 classes,它根据传入的 String 参数实现了 Command
接口。
工厂class
@Component
@RequiredArgsConstructor
public class CommandFactory {
private final ACommand aCommand;
private final BCommand bCommand;
private final CCommand cCommand;
private final DCommand dCommand;
private final ECommand eCommand;
private final FCommand fCommand;
public Command createCommand(String content) {
if (aCommand.isMatching(content)) {
return aCommand;
} else if (bCommand.isMatching(content)) {
return bCommand;
} else if (cCommand.isMatching(content)) {
return cCommand;
} else if (dCommand.isMatching(content)) {
return dCommand;
} else if (eCommand.isMatching(content)) {
return eCommand;
} else if (fCommand.isMatching(content)) {
return fCommand;
} else {
return null;
}
}
在 isMatching()
方法中有不同的正则表达式,我试图弄清楚应该如何处理这个传入的字符串。
我正在寻找一种更简洁的方法来摆脱这些连续的 if 语句。因为每当我在这个工厂中创建一个新的 class 时,我都会添加另一个 if 语句。
也许Stream
可以帮忙?
Stream<Command> stream = Stream.of(aCommand, bCommand, cCommand ...);
return stream.filter(x -> x.isMatching(content)).findFirst().orElse(null);
现在每次添加新的 class 时,您只需在第一行添加一个新对象。
如果你想摆脱连续的 if 语句,你可以使用流(如用户 建议的)或循环,我也建议 return 和可选的,这使得 null
为客户处理得更清楚。
这里有两个建议的选项来摆脱 if else
重复,一个是循环,另一个是流:
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class CommandPatternExample {
private List<Command> candidates = Arrays.asList(new ACommand(), new BCommand(), new CCommand());
public Optional<Command> createCommand(String content) {
for(Command command : candidates) {
if(command.isMatching(content)) {
return Optional.of(command);
}
}
return Optional.empty();
}
public Optional<Command> createCommandStream(String content) {
return candidates.stream().filter(c -> c.isMatching(content)).findFirst();
}
}
interface Command<T> {
void execute(T obj);
boolean isMatching(String s);
}
class ACommand implements Command<String> {
@Override
public void execute(String obj) {
}
@Override
public boolean isMatching(String s) {
return "A".equals(s);
}
}
class BCommand implements Command<String> {
@Override
public void execute(String obj) {
}
@Override
public boolean isMatching(String s) {
return "B".equals(s);
}
}
class CCommand implements Command<String> {
@Override
public void execute(String obj) {
}
@Override
public boolean isMatching(String s) {
return "C".equals(s);
}
}
地图可能是个好主意。这意味着如果您将命令实例作为值放入映射中,您的键将是可以与传入字符串匹配的值。然后,您可以获得更好的性能 O(1),而不是使用效率 O(n) 的顺序搜索。这是一个简短的回答。
除此之外还有一个开源 java 库 MgntUtils(由我编写),其中包含一些名为 "Self-instantiating factories" 的实用程序,基本上它为您管理和工厂。您需要做的就是创建一个实现特定接口的 class,该实用程序会为您将其添加到基于地图的工厂中。它可能对你有用。这是一篇文章的 link,解释了库中的实用程序以及从何处获取库(Github 和 Maven 中心)。在文章中查找段落“生命周期管理(自实例化工厂)”。该库还附带了详细的书面 java 文档和该功能的代码示例。
我在 class 中创建了一个工厂模式。
在这个 class 中,我注入了 classes,它根据传入的 String 参数实现了 Command
接口。
工厂class
@Component
@RequiredArgsConstructor
public class CommandFactory {
private final ACommand aCommand;
private final BCommand bCommand;
private final CCommand cCommand;
private final DCommand dCommand;
private final ECommand eCommand;
private final FCommand fCommand;
public Command createCommand(String content) {
if (aCommand.isMatching(content)) {
return aCommand;
} else if (bCommand.isMatching(content)) {
return bCommand;
} else if (cCommand.isMatching(content)) {
return cCommand;
} else if (dCommand.isMatching(content)) {
return dCommand;
} else if (eCommand.isMatching(content)) {
return eCommand;
} else if (fCommand.isMatching(content)) {
return fCommand;
} else {
return null;
}
}
在 isMatching()
方法中有不同的正则表达式,我试图弄清楚应该如何处理这个传入的字符串。
我正在寻找一种更简洁的方法来摆脱这些连续的 if 语句。因为每当我在这个工厂中创建一个新的 class 时,我都会添加另一个 if 语句。
也许Stream
可以帮忙?
Stream<Command> stream = Stream.of(aCommand, bCommand, cCommand ...);
return stream.filter(x -> x.isMatching(content)).findFirst().orElse(null);
现在每次添加新的 class 时,您只需在第一行添加一个新对象。
如果你想摆脱连续的 if 语句,你可以使用流(如用户 null
为客户处理得更清楚。
这里有两个建议的选项来摆脱 if else
重复,一个是循环,另一个是流:
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class CommandPatternExample {
private List<Command> candidates = Arrays.asList(new ACommand(), new BCommand(), new CCommand());
public Optional<Command> createCommand(String content) {
for(Command command : candidates) {
if(command.isMatching(content)) {
return Optional.of(command);
}
}
return Optional.empty();
}
public Optional<Command> createCommandStream(String content) {
return candidates.stream().filter(c -> c.isMatching(content)).findFirst();
}
}
interface Command<T> {
void execute(T obj);
boolean isMatching(String s);
}
class ACommand implements Command<String> {
@Override
public void execute(String obj) {
}
@Override
public boolean isMatching(String s) {
return "A".equals(s);
}
}
class BCommand implements Command<String> {
@Override
public void execute(String obj) {
}
@Override
public boolean isMatching(String s) {
return "B".equals(s);
}
}
class CCommand implements Command<String> {
@Override
public void execute(String obj) {
}
@Override
public boolean isMatching(String s) {
return "C".equals(s);
}
}
地图可能是个好主意。这意味着如果您将命令实例作为值放入映射中,您的键将是可以与传入字符串匹配的值。然后,您可以获得更好的性能 O(1),而不是使用效率 O(n) 的顺序搜索。这是一个简短的回答。
除此之外还有一个开源 java 库 MgntUtils(由我编写),其中包含一些名为 "Self-instantiating factories" 的实用程序,基本上它为您管理和工厂。您需要做的就是创建一个实现特定接口的 class,该实用程序会为您将其添加到基于地图的工厂中。它可能对你有用。这是一篇文章的 link,解释了库中的实用程序以及从何处获取库(Github 和 Maven 中心)。在文章中查找段落“生命周期管理(自实例化工厂)”。该库还附带了详细的书面 java 文档和该功能的代码示例。