我有一个名为" var"的字符串。其中文本字符串设置为doc1,doc2或doc3
String var = "doc2" // doc1 or doc2 or doc3
我以这种方式使用Jsoup从网站获取内容
Document doc_comp = Jsoup.connect("http://www.computer.org").get();
Elements doc1_comp = doc_comp.select("ul > doc1" );
Elements doc2_comp = doc_comp.select("ul > doc2" );
Elements doc3_comp = doc_comp.select("ul > doc3" );
我使用switch case来打印相应的值
switch(var)
{
case "doc1": System.out.println(doc1_comp.text());
break;
case "doc2":System.out.println(doc2_comp.text());
break;
case "doc3":System.out.println(doc3_comp.text());
break;
default: System.out.println("no info");
}
开关盒的一切都很完美,但我想用一行代码代替这样的开关盒
System.out.println(var.concat("_comp.text()"));
但它会立即以字符串" var_comp.text()" 打印,但不执行它并在其中打印内容。
有没有办法让它运行
答案 0 :(得分:0)
您可以使用Ternary operator
将switch statement
替换为一行代码,但使用三元运算符不会使其比switch语句更快或更有效。
<强>样品:强>
System.out.println(var.equals("doc1") ? doc1_comp.text() : (var.equals("doc2") ? doc2_comp.text() : ( var.equals("doc3") ? doc3_comp.text() : "no info" ) ));
答案 1 :(得分:0)
我认为switch
语句很好(事实上best option
)。但是如果你真的想要执行字符串内容,
您可以使用轻量级脚本框架(如java script
或bean shell
。
对于可以用java实现的东西,我会劝阻它, 但肯定有一些使用脚本框架的情况 因为真的需要胶水。
使用javascript查看以下示例:
package com.demo.test;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptTest {
public static void main(String[] args) throws ScriptException {
ScriptEngine jse = new ScriptEngineManager()
.getEngineByName("javascript");
Bindings bindings = jse.getBindings(ScriptContext.ENGINE_SCOPE);
ScriptTest test = new ScriptTest();
bindings.put("test", test);
String preFix = "demo";
jse.eval("test." + preFix + "_test()");
preFix = "actual";
jse.eval("test." + preFix + "_test()");
}
public void demo_test() {
System.out.println("demo test");
}
public void actual_test() {
System.out.println("actual test");
}
}
这肯定不是单行解决方案,因为它需要脚本 要设定的环境。你还需要在两个上下文中处理对象传递
Note:
这会影响效果severely
。 (执行命名空间切换成本很高)
个人而言我更喜欢beanhell而不是javascript,它的性能稍微好一些,但是你需要包含它的依赖jar(尽管占用空间小),但javascript的情况并不是开箱即用的。
答案 2 :(得分:0)
您可以直接在var
方法和doc_comp.select()
方法中使用System.out.println()
。例如:
String var = "doc2" // doc1 or doc2 or doc3
Document doc_comp = Jsoup.connect("http://www.computer.org").get();
Elements doc_comp_var = doc_comp.select("ul > " + var);
System.out.println(doc_comp_var.text());
答案 3 :(得分:0)
你可以使用反射,但这并不是非常有效,通常会增加复杂性并使代码安全性降低。
我可能会误解完全您正在尝试实现的目标,但我认为将所有这些文档Elements
放入{{1}中是最简单的}}。它不会制作单行,但它的性能优于Reflection,并使代码更简洁。像这样:
HashMap<String, Elements>
然后:
Document doc_comp = Jsoup.connect("http://www.computer.org").get();
Map<String, Elements> map = new HashMap<>();
for(int i=1; i < 4; ++i) {
map.put("doc" +i+ "_comp", doc_comp.select("ul > doc"+i) );
}
一般情况下,如果你想发送&#34;发送&#34;某些基于Elements elem = map.get(var + "_comp");
if( elem != null ) {
System.out.println( elem.text() );
}
else {
System.out.println("no info");
}
的方法并希望避免反射,那么合理的方法是设计Strings
,将实现该接口的类实例放入interface
,并执行地图查找执行调度。
即
Map
然后,您创建一个&#34;发送地图&#34; (可能在应用程序启动期间):
public interface MyInterface {
public void doSomething();
}
public class A implements MyInterface {
@Override
public void doSomething() {
System.out.println("do something class A");
}
}
public class B implements MyInterface {
@Override
public void doSomething() {
System.out.println("do something class B");
}
}
并且有一个使用调度映射来查找要执行的代码的方法:
Map<String, MyInterface> dispatchMap = new HashMap<>();
dispatchMap.put("thingA", new A());
dispatchMap.put("thingB", new B());
dispatchMap.put("thingX", new A()); // etc...
以后的客户端代码可以使用您的调度机制动态执行方法:
public void doSomethingBasedOnString(String thingName) {
MyInterface code = dispatchMap.get(thingName);
if( code != null ) {
code.doSomething();
}
else {
// dynamic code lookup failed
}
}