Это легкое решение сработало для меня:
public class MyObject {
private Object rawJsonValue;
public Object getRawJsonValue() {
return rawJsonValue;
}
public void setRawJsonValue(Object rawJsonValue) {
this.rawJsonValue = rawJsonValue;
}
}
Таким образом, я смог сохранить исходное значение JSON в переменной rawJsonValue, и тогда не было никакой проблемы десериализовать его (как объект) с другими полями назад к JSON и отправить через мой REST. Использование @JsonRawValue мне не помогло, потому что сохраненный JSON был десериализован как String, а не как объект, и это было не то, что я хотел.
Приправление карри состоит в том при разрушении функции, которая берет несколько аргументов в серию функций, что каждый берет только один аргумент. Вот пример в JavaScript:
function add (a, b) {
return a + b;
}
add(3, 4); // returns 7
Это - функция, которая берет два аргумента, a и b, и возвращает их сумму. Мы теперь приправим эту функцию карри:
function add (a) {
return function (b) {
return a + b;
}
}
Это - функция, которая берет один аргумент, a, и возвращает функцию, которая берет другой аргумент, b, и что функция возвращает их сумму.
add(3)(4);
var add3 = add(3);
add3(4);
первый оператор возвращается 7, как добавление (3, 4) оператор. Второй оператор определяет новую функцию, вызванную add3, который добавит 3 к его аргументу. Это - то, что некоторые люди могут назвать закрытием. Третий оператор использует add3 операцию для добавления 3 - 4, снова производя 7 в результате.
Приправление карри является преобразованием, которое может быть применено к функциям, чтобы позволить им брать ту меньше аргумента, чем ранее.
, Например, в F# можно определить функциональный thus:-
let f x y z = x + y + z
, Здесь функционируют, f берет параметры x, y и z и суммирует их вместе Возвраты so:-
f 1 2 3
6.
Из нашего определения мы можем, может поэтому определить функцию карри для f:-
let curry f = fun x -> f x
, Где 'забава x-> f x' является функцией лямбды equivilent к x => f (x) в C#. Эта функция вводит функцию, которую Вы хотите приправить карри, и возвращает функцию, которая берет отдельный аргумент и возвращает указанную функцию с первым набором аргумента к входному параметру.
Используя наш предыдущий пример мы можем получить карри f thus:-
let curryf = curry f
, Мы можем тогда сделать following:-
let f1 = curryf 1
, Который предоставляет нам функцию f1, который является equivilent к f1 y z = 1 + y + z. Это означает, что мы можем сделать following:-
f1 2 3
, Который возвращается 6.
Этот процесс часто путается с 'частичным функциональным приложением', которое может быть определенным thus:-
let papply f x = f x
, Хотя мы можем расширить его больше чем до одного параметра, т.е..:-
let papply2 f x y = f x y
let papply3 f x y z = f x y z
etc.
А частичное приложение возьмет функцию и параметр (параметры) и возвратит функцию, которая требует одного или нескольких меньшего количества параметров, и поскольку предыдущие два шоу в качестве примера реализованы непосредственно в стандартном определении функции F#, таким образом, мы могли достигнуть предыдущего thus:-
let f1 = f 1
f1 2 3
результата, Который возвратит результат 6.
В conclusion:-
различие между приправлением карри и частичным функциональным приложением является that:-
Приправляющие карри взятия функция и обеспечивает новую функцию, принимающую отдельный аргумент и возвращающую указанную функцию с ее первым набором аргумента к тому аргументу. Это позволяет нам представлять функции с несколькими параметрами как серия функций отдельного аргумента . Example:-
let f x y z = x + y + z
let curryf = curry f
let f1 = curryf 1
let f2 = curryf 2
f1 2 3
6
f2 1 3
6
Частичное функциональное приложение является более прямым - оно берет функцию и один или несколько аргументов и возвращает функцию с первым n набором аргументов к n определенным аргументам. Example:-
let f x y z = x + y + z
let f1 = f 1
let f2 = f 2
f1 2 3
6
f2 1 3
6
Функция с приправой карри является функцией нескольких аргументов, переписанных таким образом, что она принимает первый аргумент и возвращает функцию, которая принимает второй аргумент и так далее. Это позволяет функциям нескольких аргументов иметь некоторые свои начальные аргументы, частично примененные.
Это эквивалентно тому, что неравнодушный делает в Python. Когда мы хотим использовать родовую функцию для сфокусированной цели, мы фиксируем подмножество параметров с помощью этого механизма.
Вот пример дженерика и самой короткой версии для функции, приправляющей карри с n нет. из параметрических усилителей.
const add = a => b => b ? add(a + b) : a;
const add = a => b => b ? add(a + b) : a;
console.log(add(1)(2)(3)(4)());
Я нашел эту статью и статью, на которую она ссылается, полезной для лучшего понимания каррирования: http://blogs.msdn.com/wesdyer/archive/2007/01/29/currying-and-partial-function-application.aspx
Как уже упоминалось другими, это всего лишь способ получить функция с одним параметром.
Это полезно, поскольку вам не нужно предполагать, сколько параметров будет передано, поэтому вам не нужны функции с двумя параметрами, с тремя параметрами и с четырьмя параметрами.
Вот конкретный пример:
Предположим, у вас есть функция, которая вычисляет гравитационную силу, действующую на объект. Если вы не знаете формулу, вы можете найти ее здесь . Эта функция принимает в качестве аргументов три необходимых параметра.
Теперь, находясь на Земле, вы хотите вычислить силы только для объектов на этой планете. На функциональном языке вы можете передать функции массу земли, а затем частично ее оценить. Вы получите еще одну функцию, которая принимает только два аргумента и вычисляет гравитационную силу объектов на Земле. Это называется каррированием.
В алгебре функций работа с функциями, которые принимают несколько аргументов (или эквивалентный один аргумент, состоящий из N-кортежей), несколько неэлегантно, но, как доказал Мозес Шенфинкель (и, независимо, Хаскелл Карри), в этом нет необходимости: все вам нужны функции, которые принимают один аргумент.
Так как же поступить с тем, что вы естественным образом выразили бы как, скажем, f (x, y)
? Что ж, вы примете это как эквивалент f (x) (y)
- f (x)
, назовите его g
, это функция, и вы примените эту функцию к и
. Другими словами,
Here's a toy example in Python:
>>> from functools import partial as curry
>>> # Original function taking three parameters:
>>> def display_quote(who, subject, quote):
print who, 'said regarding', subject + ':'
print '"' + quote + '"'
>>> display_quote("hoohoo", "functional languages",
"I like Erlang, not sure yet about Haskell.")
hoohoo said regarding functional languages:
"I like Erlang, not sure yet about Haskell."
>>> # Let's curry the function to get another that always quotes Alex...
>>> am_quote = curry(display_quote, "Alex Martelli")
>>> am_quote("currying", "As usual, wikipedia has a nice summary...")
Alex Martelli said regarding currying:
"As usual, wikipedia has a nice summary..."
(Just using concatenation via + to avoid distraction for non-Python programmers.)
Editing to add:
See http://docs.python.org/library/functools.html?highlight=partial#functools.partial, which also shows the partial object vs. function distinction in the way Python implements this.