何时使用AsyncTask和何时使用Thread两者都在后台工作,并且都可以UI Thread通过某种机制操纵控件。
我正在为工作场所中的某些 json 数据编写自定义反序列化器,我必须通过 setter 方法设置许多值,并且我只想在它们不为空时才这样做。
我可以通过将 setter 函数作为参数传递给另一个方法来在 Java 中执行此操作吗?
即伪代码:
private void setValue(Func setterMethod, <T> value){
if (value != null){
setterMethod(value);
}
}
Run Code Online (Sandbox Code Playgroud) 我知道如何将参数传递给方法 - 您将类/基元名称放在方法标头中,并在调用所述方法时替换该类型的值。是否可以将一系列语句传递给方法(在java中),类似于传递变量的方式?例如,诸如此类的东西:
repeat(5) {
System.out.println("Hello");
}
...
private void repeat(int arg, {} statements) {
for (int x = 0; x < arg; x++) {
statements;
}
}
Run Code Online (Sandbox Code Playgroud)
这里所需的输出是打印“Hello”5 次。
显然语法不正确,但这有可能吗?
我正在尝试编写一个函数,因此我可以将函数作为参数传递,例如
public class HashFunction {
private Function f;
public HashFunction(Function f) {
this.f=f;
}
public Integer hash(String s){
return f(s);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可以写代码
new HashFunction(function(String s){ return s.charAt(0)+0; });
Run Code Online (Sandbox Code Playgroud)
就像在 javascript 中一样。我怎样才能做到这一点?
我有一个重复使用的代码节.这是两个例子:
public java.sql.Struct createStruct(String typeName, Object[] attributes) {
String searchPath = getSearchPath();
String name = setSearchPathToSchema(typeName);
Struct ret = delegate().createStruct(name.toLowerCase(), attributes);
setSearchPath(searchPath);
return ret;
}
public java.sql.Array createArray(String typeName, Object[] elements) {
String searchPath = getSearchPath();
String name = setSearchPathToSchema(typeName);
Array ret = delegate().createArray(name.toLowerCase(), elements);
setSearchPath(searchPath);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
您可以看到这两种方法具有一般形式:
public <T> createXXX(String typeName, Object[] objects) {
String searchPath = getSearchPath();
String name = setSearchPathToSchema(typeName);
T ret = delegate().createXXX(name.toLowerCase(), objects);
setSearchPath(searchPath);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
具有共同签名但返回类型不同T的某些函数集的返回类型在哪里createXXX.
我非常确定如何在Javascript,F#,C#,Scala或任何其他语言中执行此操作. …
我阅读了关于将函数作为参数传递的下一个答案.
不过,我不明白这个想法.我的函数可以得到任何函数:sin(x),cos(x)等.
据我所知,我可以创建一个界面,例如:
public interface functionI<T> {
}
Run Code Online (Sandbox Code Playgroud)
这将包装它.
现在我有我的功能:
public void needToDo(functionI<Integer> a, int x0Par, int hPar){
}
Run Code Online (Sandbox Code Playgroud)
(needToDo,例如,需要替换函数n x0par和hPar的x,并找到Max.如果我得到sin(x),我需要找到sin(x0Par)和(sin(hPar))的最大值.
我不明白我在我的功能中如何使用它.当我得到函数时,我怎么知道该怎么做,可以是任何东西(多项式,sin(x)等)
可能重复:
Java中函数指针的最接近的替代是什么?
我只是有一种情况,如果你可以在c或c ++中使用类似于函数指针的功能,那就太好了.我能想到的最好的事情是组合Runnables并在不同的线程中启动它们.建议?
我的collect()函数调用Foo.f().我想让Foo.f()自己成为我的功能参数.这在Java中可行吗?
Foo.f()或Foo.g()(或任何其他函数Foo返回a String)传递给我的函数?.
class Foo {
public String f() { return "f"; }
public String g() { return "g"; }
// ...
}
public List<String> collect(List<Foo> foos)
{
List<String> result = new ArrayList<String>();
for (final Foo foo: foos) {
result.add(foo.f()); // I want Foo.f to be a parameter
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
更新
我想指出的事实是,我不只是调用相同的函数,而是调用集合中f所有项的成员函数List<Foo>.