小编gia*_*olo的帖子

scala返回第一个列表中的一些

我有一个列表l:List[T1],目前我正在做以下事情:

myfun : T1 -> Option[T2]
val x: Option[T2] = l.map{ myfun(l) }.flatten.find(_=>true)
Run Code Online (Sandbox Code Playgroud)

myfun函数返回None或Some,flatten抛弃所有None,并且find返回列表的第一个元素(如果有的话).

这对我来说似乎有些苛刻.我认为可能存在一些理解或类似的东西会减少浪费或更聪明.例如:我不需要如有后续的答案myfun返回任何 Somemap列表中l.

functional-programming scala list scala-option

14
推荐指数
1
解决办法
4434
查看次数

有没有办法发现Cassandra CQL表结构?

假设我使用CQL来定义此表.

CREATE TABLE songs (
    id uuid PRIMARY KEY, 
    title text,
    album text, 
    artist text, 
    tags set<text>, 
    data blob);
Run Code Online (Sandbox Code Playgroud)

其他开发人员(或几周后我自己)(重新)如何发现此表的布局?

我在考虑与MySQL DESCRIBE {tablename}命令相同的东西.

[编辑]

我看到DESCRIBECassandra的命令行界面(CLI)中有一个方法,但在使用它时,它声明它的结果中不包含有关CQL表的信息.

cql cassandra

14
推荐指数
2
解决办法
2万
查看次数

使用Datastax Cassandra驱动程序时重用PreparedStatement?

我目前正在使用Cassandra 2的Datastax Cassandra驱动程序来执行cql3.这工作正常.我开始使用PreparedStatement's:

Session session = sessionProvider.getSession();
try {
    PreparedStatement ps = session.prepare(cql);
    ResultSet rs = session.execute(ps.bind(objects));
    if (irsr != null) {
       irsr.read(rs);
    }
}
Run Code Online (Sandbox Code Playgroud)

有时我会在日志中收到驱动程序的警告:

Re-preparing already prepared query . Please note that preparing the same query more than once is generally an anti-pattern and will likely affect performance. Consider preparing the statement only once.
Run Code Online (Sandbox Code Playgroud)

这个警告是有道理的,但我不确定我应该如何重用PreparedStatement

我应该只是PreparedStatement在构造函数/ init方法中创建我的所有内容而不是简单地使用它们吗?

但是当多个线程同时使用相同的线程PreparedStatement时(特别是调用PreparedStatement.bind()绑定对象),这是否顺利

java cassandra datastax-java-driver

14
推荐指数
2
解决办法
1万
查看次数

有什么方法可以在运行时使用反射访问Scala Option声明的类型?

所以,我有一个看起来像这样的Scala类:

class TestClass {
  var value: Option[Int] = None
}
Run Code Online (Sandbox Code Playgroud)

我正在解决一个问题,我有一个String值,我想在运行时使用反射将其强制转换为Option [Int].所以,在另一段代码中(对TestClass一无所知)我有一些这样的代码:

def setField[A <: Object](target: A, fieldName: String, value: String) {
  val field = target.getClass.getDeclaredField(fieldName)
  val coercedValue = ???; // How do I figure out that this needs to be Option[Int] ? 
  field.set(target, coercedValue)   
}
Run Code Online (Sandbox Code Playgroud)

为此,我需要知道该字段是一个Option,并且Option的type参数是Int.

我可以选择在运行时(即使用反射)确定'value'的类型是Option [Int]?

我已经看到通过注释字段解决了类似的问题,例如@OptionType(Int.class).如果可能的话,我更喜欢不需要在反射目标上进行注释的解决方案.

reflection types scala parameterized scala-option

13
推荐指数
1
解决办法
2515
查看次数

Scala:带有两个或更多选项的地图

基本上我正在寻找最像scala的方式来做以下事情:

def sum(value1: Option[Int], value2: Option[Int]): Option[Int] = 
  if(value1.isDefined && value2.isDefined) Some(value1.get + value2.get)
  else if(value1.isDefined && value2.isEmpty) value1
  else if(value1.isEmpty && value2.isDefined) value2
  else None
Run Code Online (Sandbox Code Playgroud)

这给出了正确的输出:

sum(Some(5), Some(3))  // result = Some(8)
sum(Some(5), None)     // result = Some(5)
sum(None, Some(3))     // result = Some(3)
sum(None, None)        // result = None
Run Code Online (Sandbox Code Playgroud)

然而,总结两个以上的选项,我必须使用太多ifs或使用某种循环.

编辑-1:

在写这个问题时,我想出了一个答案:

def sum2(value1: Option[Int], value2: Option[Int]): Option[Int] = 
  value1.toList ::: value2.toList reduceLeftOption { _ + _ }
Run Code Online (Sandbox Code Playgroud)

这个看起来非常惯用于我没有经验的眼睛.这甚至可以使用两个以上的值.可以在不转换为列表的情况下执行相同的操作吗?

EDIT 2:

我最终得到了这个解决方案(感谢ziggystar):

def sum(values: …
Run Code Online (Sandbox Code Playgroud)

scala scala-option

13
推荐指数
4
解决办法
3960
查看次数

最好在获取URL时返回None或抛出异常?

我有一个Scala帮助器方法,当前尝试获取URL并返回带有该网页的HTML的Option [String].

如果有任何异常(格式错误的URL,读取超时等等)或者如果有任何问题,则返回None.问题是,抛出异常以便调用代码可以记录异常或者在这种情况下返回None是否更好?

scala exception idiomatic throw scala-option

13
推荐指数
1
解决办法
2472
查看次数

为什么Option需要在for循环中显式显示toList?

使用带有简单选项的for循环可以:

scala> for (lst <- Some(List(1,2,3))) yield lst
res68: Option[List[Int]] = Some(List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

但循环选项的内容不会:

scala> for (lst <- Some(List(1,2,3)); x <- lst) yield x
<console>:8: error: type mismatch;
 found   : List[Int]
 required: Option[?]
              for (lst <- Some(List(1,2,3)); x <- lst) yield x
                                               ^
Run Code Online (Sandbox Code Playgroud)

...除非Option明确转换为List:

scala> for (lst <- Some(List(1,2,3)).toList; x <- lst) yield x
res66: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

为什么需要显式列表转换?这是惯用的解决方案吗?

scala scala-option

13
推荐指数
1
解决办法
264
查看次数

在Java中始终抛出相同的异常实例

总是告诉我Java异常处理非常昂贵.

我问的是,在程序开头创建特定类型的异常实例并且不创建新的异常实例是一个好习惯,总是抛出相同的异常对象.

我只想举个例子.常用代码:

if (!checkSomething(myObject))
   throw new CustomException("your object is invalid");
Run Code Online (Sandbox Code Playgroud)

替代方案:

static CustomException MYEXP = new CustomException("your object is invalid");

//somewhere else
if (!checkSomething(myObject))
    throw MYEXP;
Run Code Online (Sandbox Code Playgroud)

当然,我在这里做一些假设:

  1. MyCustomException 没有参数
  2. 客户端代码,无论何时是一种良好的实践,都是基于异常处理的重量级,并且重构不是一种选择.

所以问题是:

  1. 这是一个好习惯吗?
  2. 这会损坏一些JVM机制吗?
  3. 如果1为是,则有可能获得性能提升?(我想不是,但不确定)
  4. 如果1和3是肯定的,为什么不赞助作为练习?
  5. 如果1不是,为什么Martin Odersky在他对Scala的介绍中告诉我这是Scala在某些情况下的工作原理?(在28:30分,他告诉说实施休息已经抛出异常,观众说这很费时间并且他回复说每次都不会创建例外)Fosdem 2009

我希望这不是一个闲置/愚蠢的问题,我对此很好奇.我认为异常处理的实际成本是处理而不是创建.

编辑 添加了关于FOSDEM演示的精确讨论的参考

免责声明:我的代码都没有像提议的那样工作,我无意管理这样的异常,我只是在做一个"假设"问题,而这种好奇心是从视频的肯定中产生的.我想:如果在Scala中完成,为什么不在Java中呢?

java scala exception-handling

13
推荐指数
1
解决办法
1263
查看次数

Gson使用InstanceCreator反序列化嵌套对象

我有一个名为的类PageItem,它有一个带有Contextas参数的构造函数:

PageItem(Context context)
{
    super(context);
    this.context = context;
}
Run Code Online (Sandbox Code Playgroud)

PageItem 有这些属性:

private int id; 
private String Title; 
private String Description; 
public Newsprovider newsprovider; 
public Topic topic;
Run Code Online (Sandbox Code Playgroud)

Newsprovider并且Topic是我的应用程序的其他类,并具有以下构造函数:

Newsprovider (Context context)
{
    super(context);
    this.context = context;
}

Topic (Context context)
{
    super(context);
    this.context = context;
}
Run Code Online (Sandbox Code Playgroud)

PageItem,Newsprovider并且Topic是的子类SQLiteOpenHelper.

我想PageItem用Gson 反序列化数组,所以我写道:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PageItem.class, new PageItemInstanceCreator(context));
Gson gson = gsonBuilder.create();
Pageitem pis[] = gson.fromJson(s, …
Run Code Online (Sandbox Code Playgroud)

java android gson

13
推荐指数
1
解决办法
1万
查看次数

是否有相当于Scala选项的红宝石?

如何在ruby中建模可选值?Scala有Option [],这是我在ruby中寻找的东西.

ruby scala scala-option

12
推荐指数
1
解决办法
2179
查看次数