在java中使用字符串作为命令

时间:2014-06-21 02:09:20

标签: java string switch-statement jsoup

我有一个名为" 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()" 打印,但不执行它并在其中打印内容。

有没有办法让它运行

4 个答案:

答案 0 :(得分:0)

您可以使用Ternary operatorswitch 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 scriptbean 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
    }
}