(Just answering the first question. Others have answered the second question thoroughly.)
It's worth mentioning that you can do
{x,y} // (f @@ #) &
f[x,y]
(No parentheses needed, but I added them for clarity.)
You could even make your own function to do this (slightly) more compactly, especially if you have trouble remembering the @'s and #'s :
ClearAll[pf]
pf[ argList_, f_ ] := f @@ argList
Then you can do what you want using an infix operator:
{x,y} ~pf~ f
f[x,y]
Edit:
Lately I've taken to writing my first example above as
{x,y} // Apply[f]
or
{x,y} // Apply@f
which I fine somewhat more readable, particularly when there are other pure functions involved. Note that this uses the operator form of Apply.
x // f[#, ...]&if you need to supply extra arguments like inTable[{i, 2^i}, {i, 24, 0, -1}] // TableForm[#, TableHeadings -> {None, {"i", "2^i"}}] &– Ludovic Kuty Feb 10 '17 at 12:08