2016-04-07 1 views
4

Параметры в scala и java - это то, с чем я борюсь, чтобы понять и работать. Я понимаю его там, чтобы устранить «нулевую» обработку ада. Честно говоря, я думаю, что он вводит другой вид ада!Параметры Scala и Java делают, если они есть, если не делают что-то другое.

Как я иметь дело с нулями в Java, чтобы сделать что-то вроде:

String test = null; 
if(test==null) // do something 
else // do something else 

Такого рода решения является то, что я стремлюсь делать, когда я переключаюсь Options.

Но в классе Option в scala и java нет метода, чтобы сказать, если null что-то сделать, иначе сделайте что-нибудь еще.

Существует способ по умолчанию значения в случае предметного бытия нуля, например

//in scala 
test.getOrElse("defaulted") 

мне было интересно, почему не может быть методы, такие как неявный класс я написал в «салатном» а Вариант Scala

object Definitions{ 
    implicit class OptionExtensions[$Data](option: Option[$Data]){ 
    def perform (found: ($Data)=>Any, notFound:()=>Any): Any={ 
     option match{ 
     case Some(data)=> found(data) 
     case None=> notFound() 
     } 
    } 
    } 
} 

Пожалуйста, игнорируйте плохо названный метод. Но теперь с этим написано, я мог бы предположительно использовать вариант, как это:

import Definitions._ 

val test : Option[String] = None 

var builder =new StringBuilder 


test.perform(builder ++= _,()=>addError("not found")) 
//or 
println(test.perform(_.reverse,()=>{"something else"})) 

def addError(error:String)={ 
    println(error) 
} 

Вместо этого я вынужден написать матч и дело на что-либо делать с вариантами обработки. Я должен делать что-то неправильно. Скорее всего, мое понимание того, как использовать «Параметры», является ошибочным. Вышеупомянутый способ обработки по умолчанию не входит в класс Option по причине. Теперь, какова могла быть эта причина?

+1

Использование 'Any' в качестве типа ваших методов (или параметров метода) приводит вас к настоящему аду (вы теряете всю мощь, предлагаемую системой типов). Тем не менее, самый идиоматический способ использования экземпляра 'Option' - рассматривать его как коллекцию или монаду и использовать' map', 'flatMap',' filter' или 'foreach'. – jarandaf

+0

http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html Прокрутите вниз до «Сделать что-то, если значение присутствует» ... – Fildor

+2

Scala уже имеет 'fold' для этого:' test.fold (addError ("not found")) (builder ++ = _) ' – Kolmar

ответ

5

В Скале существует несколько способов достижения этой цели:

  • optValue.map(successFunction).getOrElse(errorFunction)
  • optValue.fold(errorFunction)(successFunction)

вероятно, что вы хотите, является вторым, fold.

В Java есть .map, не уверен, если есть .fold, вам нужно взглянуть на the docs

EDIT: Как вы попросили у новой строки в складке, попробуйте с кронштейнами:

Some(2).fold 
    { 
    println("error") 
    } 
    { 
    value => 
     println(s"Success: $value") 
    } 
+0

спасибо за это. Метод карты также выглядит полезным, используемым таким образом. С методом fold не могу написать fold (...) (...) как fold \ n (...) \ n (...)? В этом случае поместите новую строку после сгиба и после каждой из скобок для удобочитаемости. Моя IDE отображается как ошибка. – sethu

+0

попробовать фигурные скобки {}: 'Некоторые (2) .fold { Println ("ошибка") } { значение => Println (s "Успех: $ значение") }' – pedrorijo91

+0

комментарии проигрывают новой строки , редактирование ответа – pedrorijo91

1

Я думаю, что вам не хватает причина почему вам нужны варианты.

Идея Параметры (и OPTIONALS в Java), является то, что вы (разработчик) теперь можно утверждать, что значение может или не может присутствовать, на уровне типа.

Возьмите секунду, чтобы об этом подумать. Как бы вы это сделали с переменной, которая может быть только нулевой?

...

Это проблема, не так ли?

  • вы не знаете, если это когда-либо будет нулевым, когда вы прочитать значение
  • вы должны всегда проверить, если он является недействительным с такой переменной, если вы хотите, чтобы ваш код, чтобы быть безопасным ,

Но теперь, с опциями/OPTIONALS, вы и некоторые другие разработчики, которые работают с кодом теперь рассказанные компилятор, что они должны проверить возможность того, что эта переменная будет нулевым (или нет !).

Если мы сейчас сделаем этот шаг дальше, представьте, напишите ли вы весь свой код таким образом, чтобы любая переменная, которая может быть нулевой, является опцией. Любая переменная, которая никогда не будет равна null (всегда будет иметь значение), нет! Теперь вы поняли мою точку зрения, не так ли?

Если вы напишете весь свой код, как это, вы никогда не будете случайно полагаться на наличие ценности, которой нет, и не делаете ненужных проверок, было ли значение там, когда оно всегда есть! ;)

+1

Вам не хватает точки OP. Думаю, он это понимает. Но он хочет что-то сделать, когда Option None, что не является необоснованным. Карта и т. Д. Позволяют вам делать что-то, когда параметр является некоторым (и ничего не делать, когда он/с Нет), но если у вас есть что-то конкретное, если оно есть None (например, отображает сообщение об ошибке), это не так хорошо поддерживается , –

+0

мой ответ был основан на его: * «Я, должно быть, делаю что-то неправильно. Скорее всего, мое понимание того, как использовать« Параметры », является ошибочным». * Комментарий – gsaslis

+0

По-прежнему не отвечает на его фактический вопрос, касающийся обработки случая «Нет» (см. тему и вопрос в конце) –

Смежные вопросы